我在我的应用程序中遇到了同样的问题,我的解决方案是在 iOS 11 中,使用苹果建议的 searchBar 新方法,即在 navigationItem 中,否则,使用旧方法。我在 viewDidLoad() 中的代码如下:
if #available(iOS 11.0, *) {
navigationController?.navigationBar.prefersLargeTitles = false
navigationItem.searchController = searchController
navigationItem.hidesSearchBarWhenScrolling = false
searchViewHeight.constant = 0
} else {
searchView.addSubview(searchController.searchBar)
}
我有两个 IBOutlets:searchView 和 searchViewHeight:
@IBOutlet var searchView: UIView!
@IBOutlet var searchViewHeight: NSLayoutConstraint! // new added for iOS 11
在 iOS 11 之前,我的 viewController 的层次结构如下:
我有一个高度为 44 的 searchView 来包含我的 searchController 的 searchBar 视图。它位于导航栏下方。
在 iOS 11 中,我为 searchView 的高度约束添加了一个新的 IBOutlet,并将其常量设置为 0,隐藏此容器视图。并将 searchController 添加为导航项的一部分。
查看苹果的文档:
https://developer.apple.com/documentation/uikit/uinavigationitem/2897305-searchcontroller
还有一点,在 iOS 11 下,searchBar 的 textField 背景颜色默认比导航栏颜色深一点。为了保持一致性,您可以将其更改为白色,以下代码适用于 iOS11 及其之前的版本:
if let textField = searchController.searchBar.value(forKey: "searchField") as? UITextField {
if let backgroundView = textField.subviews.first {
// Search bar textField background color
backgroundView.backgroundColor = UIColor.white
// Search bar textField rounded corner
backgroundView.layer.cornerRadius = 10
backgroundView.clipsToBounds = true
}
}