iOS 10中UISearchBar高度大于iOS 11的问题如何解决?
谢邀!针对你遇到的iOS 10和iOS 11上UISearchBar高度不一致的问题,结合你用了Scope Bar、手动设置高度约束的场景,我给你梳理几个可行的解决方案:
1. 放弃硬编码高度,回归系统原生自适应
iOS 11之后UISearchBar的布局逻辑做了调整,尤其是带Scope Bar的场景,系统会自动处理高度适配。你之前硬设44高度约束,还在searchBarShouldBeginEditing里手动修改高度,反而会和系统的自适应逻辑冲突,这大概率是跨版本高度差异的核心原因。
- 先移除你给UISearchBar设置的固定44高度约束,让控件根据自身内容(比如Scope Bar的显示/隐藏)自动调整高度。
- 如果需要控制未激活状态的默认高度,可以通过修改
searchBar.searchBarStyle或者利用系统的intrinsicContentSize间接调整,避免硬约束破坏自适应。
2. 针对iOS版本做差异化处理
如果确实需要保留部分自定义逻辑,可以通过版本判断分别处理高度:
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool { if #available(iOS 11.0, *) { // iOS 11及以上,系统会自动容纳Scope Bar,无需手动改高度 searchBar.setShowsScopeBar(true, animated: true) } else { // iOS 10及以下,手动调整高度以放下Scope Bar(默认总高度约88) searchBar.frame.size.height = 88 searchBar.setShowsScopeBar(true, animated: true) } return true } func searchBarShouldEndEditing(_ searchBar: UISearchBar) -> Bool { if #available(iOS 11.0, *) { searchBar.setShowsScopeBar(false, animated: true) } else { searchBar.frame.size.height = 44 searchBar.setShowsScopeBar(false, animated: true) } return true }
iOS 10及以下带Scope Bar的UISearchBar总高度是44(搜索栏)+44(Scope Bar)=88,而iOS 11之后系统会把Scope Bar整合到搜索栏的布局体系里,硬改高度反而会导致布局错乱。
3. 用Auto Layout条件约束优化适配
更符合Auto Layout规范的方式是给高度约束加版本条件:
- 在Storyboard中给UISearchBar添加高度约束,并创建对应的IBOutlet(比如
searchBarHeightConstraint)。 - 在代码里根据系统版本动态修改约束的constant值:
override func viewDidLoad() { super.viewDidLoad() if #available(iOS 11.0, *) { // iOS 11及以上,禁用硬约束,让系统自适应 searchBarHeightConstraint.isActive = false } else { // iOS 10及以下,设置默认状态高度 searchBarHeightConstraint.constant = 44 } }
当激活搜索显示Scope Bar时,再把iOS 10及以下的约束constant改成88,结束编辑时改回44,比直接修改frame更稳定。
4. 排查其他布局干扰项
有时候父视图的约束、UISearchBar的translatesAutoresizingMaskIntoConstraints属性也会影响高度显示:
- 确保UISearchBar的
translatesAutoresizingMaskIntoConstraints设置为false(使用Auto Layout时必须开启)。 - 检查父视图是否给UISearchBar添加了额外的压缩/拉伸约束,导致高度被强制修改。
内容的提问来源于stack exchange,提问作者ashishn
相关产品推荐
相关产品推荐

