IOS 11では、searchBarsはデフォルトで左揃えのテキストになります。これは、iOSのネイティブな変更の残りの部分では見栄えがよくなりますが、実際には私のデザインには合わず、以前のように中心になりたいと思います。
UISearchBar
にそのようなアライメント属性が見つかりません。何か不足していますか、それとも単に不可能ですか?これを実現するには、UITextField
から派生した独自のカスタム検索バーを作成する必要がありますか?
私はまったく同じ問題を抱えていました-これを簡単に中央に戻すことなく、デフォルトの配置が変更される理由を理解するのに苦労しています。
以下は私のために働いています(Swift):
let placeholderWidth = 200 // Replace with whatever value works for your placeholder text
var offset = UIOffset()
override func viewDidLoad() {
offset = UIOffset(horizontal: (searchBar.frame.width - placeholderWidth) / 2, vertical: 0)
searchBar.setPositionAdjustment(offset, for: .search)
}
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
let noOffset = UIOffset(horizontal: 0, vertical: 0)
searchBar.setPositionAdjustment(noOffset, for: .search)
return true
}
func searchBarShouldEndEditing(_ searchBar: UISearchBar) -> Bool {
searchBar.setPositionAdjustment(offset, for: .search)
return true
}
これは少しの回避策です。
まず、検索バーのテキストフィールドを取得し、テキストの配置を中央に配置する必要があります。
let textFieldOfSearchBar = searchController.searchBar.value(forKey: "searchField") as? UITextField textFieldOfSearchBar?.textAlignment = .center
その後、プレースホルダーの配置を変更する必要があります。何らかの理由で、テキストフィールドの配置によって変化しません。検索コントローラーがアクティブな場合にのみ、テキストフィールドの左側のビューにパディングを追加することでそれを行う必要があります。そのため、デリゲートメソッドを使用します。
func presentSearchController(_ searchController: UISearchController) {
//Is active
let width: CGFloat = 100.0 //Calcualte a suitable width based on search bar width, screen size, etc..
let textfieldOfSearchBar = searchController.searchBar.value(forKey: "searchField") as? UITextField
let paddingView = UIView(x: 0, y: 0, w: width, h: searchController.searchBar.frame.size.height)
textfieldOfSearchBar?.leftView = paddingView
textfieldOfSearchBar?.leftViewMode = .unlessEditing
}
func willDismissSearchController(_ searchController: UISearchController) {
let textfieldOfSearchBar = searchController.searchBar.value(forKey: "searchField") as? UITextField
textfieldOfSearchBar?.leftView = nil
}
幸運を
それを行う公式の方法はありません。 UISearchBarDelegate
メソッドと独自のUILabel
を使用してみてください。
extension YourViewController: UISearchBarDelegate {
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
placeholderLabel.isHidden = true
}
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
placeholderLabel.isHidden = false
}
}
標準の左揃えアイコンを非表示にすることを忘れないでください(空白の画像を使用):
searchBar.setImage(UIImage.imageWithColor(.clear), for: .search, state: .normal)
let placeHolderOffSet = UIOffset(horizontal:100、vertical:0)setPositionAdjustment(placeHolderOffSet、for:.search)
バーがアクティブなときに別の位置が必要な場合は、対応するデリゲートメソッドでこれをリセットする必要があります。
Swift 4.0+
あなたの質問では実際にプレースホルダーだけを指定しているわけではないので、プレースホルダーとテキストの両方に回答します。私のプロジェクトでは、テキストフィールドを編集していないときだけでなく、両方のテキストを常に中央に配置する必要がありました。彼らが述べたようにデリゲートを使用することで、この投稿のいくつかの回答に合わせて左に戻すことができます。
また、SearchControllerを使用せず、SearchBarアウトレットを使用します。いずれにしても、コントローラーを使用する場合、プロジェクトで簡単に修正できます。 (単にsearchBarの代わりにsearchController.searchBarに置き換えてください)。
そのため、必要なときに次の関数を呼び出す必要があります。
func searchBarCenterInit(){
if let searchBarTextField = searchBar.value(forKey: "searchField") as? UITextField {
//Center search text
searchBarTextField.textAlignment = .center
//Center placeholder
let width = searchBar.frame.width / 2 - (searchBarTextField.attributedPlaceholder?.size().width)!
let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: width, height: searchBar.frame.height))
searchBarTextField.leftView = paddingView
searchBarTextField.leftViewMode = .unlessEditing
}
}
これは私のために働いた唯一のものです、Swift 4.2:
extension UISearchBar {
func setCenteredPlaceHolder(){
let textFieldInsideSearchBar = self.value(forKey: "searchField") as? UITextField
//get the sizes
let searchBarWidth = self.frame.width
let placeholderIconWidth = textFieldInsideSearchBar?.leftView?.frame.width
let placeHolderWidth = textFieldInsideSearchBar?.attributedPlaceholder?.size().width
let offsetIconToPlaceholder: CGFloat = 8
let placeHolderWithIcon = placeholderIconWidth! + offsetIconToPlaceholder
let offset = UIOffset(horizontal: ((searchBarWidth / 2) - (placeHolderWidth! / 2) - placeHolderWithIcon), vertical: 0)
self.setPositionAdjustment(offset, for: .search)
}
}
使用法:
searchBar.setCenteredPlaceHolder()