问题 如何在UISearchBar iOS 11中居中占位符文本


在iOS 11中,searchBars默认为左对齐文本。虽然这对于iOS的其他原生更改看起来很好,但它并不适合我的设计,我希望它像以前一样成为中心。

我找不到任何这样的对齐属性 UISearchBar。我错过了什么,或者根本不可能?我是否必须创建自己的自定义搜索栏,例如派生自 UITextField 为了达成这个?


9156
2018-06-18 17:24


起源

是的我也想把它放在中心。 Apple让我们设置searchBar.placeHolder.textAlignment = NSTextAlignmentCenter有多难? - coolcool1994


答案:


我有完全相同的问题 - 我正在努力理解为什么默认对齐将被更改而不允许我们轻松地将其设置回中心。

以下适用于我(斯威夫特):

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
}

7
2017-11-14 09:45





这是一个解决方法。

首先,您需要获取搜索栏的文本字段并使文本对齐居中:

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
}

祝你好运


4
2018-06-18 19:26



let paddingView = UIView(frame:CGRect(x:0,y:0,width:width,height:self.frame.size.height)) - Jacob Arvidsson


let placeHolderOffSet = UIOffset(水平:100,垂直:0) setPositionAdjustment(placeHolderOffSet,for:。search)

如果您想要在栏处于活动状态时使用其他位置,则必须在相应的委托方法中重置此位置


0
2017-10-23 22:01





对于swift 4.0+

好吧,因为你的问题并没有真正指定占位符我会给出占位符和文本的答案。在我的项目中,我需要始终将两个文本都集中在一起,而不仅仅是在我不编辑文本字段时。你可以通过使用他们所说的委托将它返回到左边与本文中的一些答案对齐。

此外,我不使用SearchController,而是使用SearchBar插座,无论哪种方式,如果您使用控制器,它可以很容易地为您的项目修复。 (只需替换searchController.searchBar而不仅仅是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
    }
}

0
2017-10-01 20:24



这是否被视为“非法”,因为您正在访问私人未曝光的子视图?此外,在ViewDidLoad中调用此方法不会考虑视图中的更改,例如旋转。也许它应该在viewDidLayoutSubviews中? - Sti
@Sti不完全,但我仍然改变了内置函数的子视图中的迭代,它直接返回searchField,就像其他一些答案一样。 - rheligon