在iOS 11中,searchBars默认为左对齐文本。虽然这对于iOS的其他原生更改看起来很好,但它并不适合我的设计,我希望它像以前一样成为中心。
我找不到任何这样的对齐属性 UISearchBar
。我错过了什么,或者根本不可能?我是否必须创建自己的自定义搜索栏,例如派生自 UITextField
为了达成这个?
在iOS 11中,searchBars默认为左对齐文本。虽然这对于iOS的其他原生更改看起来很好,但它并不适合我的设计,我希望它像以前一样成为中心。
我找不到任何这样的对齐属性 UISearchBar
。我错过了什么,或者根本不可能?我是否必须创建自己的自定义搜索栏,例如派生自 UITextField
为了达成这个?
我有完全相同的问题 - 我正在努力理解为什么默认对齐将被更改而不允许我们轻松地将其设置回中心。
以下适用于我(斯威夫特):
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
}
祝你好运
let placeHolderOffSet = UIOffset(水平:100,垂直:0) setPositionAdjustment(placeHolderOffSet,for:。search)
如果您想要在栏处于活动状态时使用其他位置,则必须在相应的委托方法中重置此位置
对于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
}
}