UISearchBarController的iOS 11问题 – search栏和范围button重叠

这里这里提到。 第一个链接没有答案。 在第二个链接,虽然答案不被接受,但链接到苹果开发者论坛给出了错误。

在iOS 11之前:

在这里输入图像说明

iOS 11:

在这里输入图像说明

注意 :相同的设备相同的代码。
另外,这意味着,所有使用此function的应用程序都必须重新发布?

在Ray Wenderlich提交的雷达中,@benck从WWDC发布了这个答案 ,如果我没有弄错的话,还没有发布。

根据你的意见,你的UISearchControllerUISearchBar已经分配给你的UITableViewtableHeaderView 。 在iOS 11中,您应该将您的UISearchController分配给视图的navigationItemsearchController属性。 您不再需要在任何地方分配UISearchBar 。 请参阅有关此新属性的Apple文档 。

我遇到了同样的问题,我的应用程序,我的解决scheme是在iOS 11,使用苹果build议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的层次如下:

我的searchView在iOS 11之前

我有一个searchView,它的高度是44,包含我的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 } } 

添加这些线为我修复:

 override func viewDidLayoutSubviews() { self.searchController.searchBar.sizeToFit() } 

我可以使用下面的代码(根据greg的回答)得到最初的外观在iOS11中正确显示:

 [self.searchController.searchBar sizeToFit]; if (@available(iOS 11.0, *)) { self.navigationItem.searchController = self.searchController; self.navigationItem.hidesSearchBarWhenScrolling = NO; } else { // Fallback on earlier versions self.tableView.tableHeaderView = self.searchController.searchBar; } 

但是,如果应用程序是后台显示,然后在search栏处于活动状态时进行恢复,则外观最终会重叠,如上面Nitish的第二个屏幕截图所示。

我能够解决以下解决方法:

 [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) { self.searchController.searchBar.showsScopeBar = NO; [self.searchController.searchBar sizeToFit]; self.searchController.searchBar.showsScopeBar = YES; [self.searchController.searchBar sizeToFit]; }]; 

(我仍然在研究如何在search栏处于活动状态时改变界面方向时解决布局问题 – 仍然会重叠。)

我认为解决scheme是在导航栏中添加search栏:

 navigationController?.navigationBar.prefersLargeTitles = true // Navigation bar large titles navigationItem.title = "Contacts" navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.white] navigationController?.navigationBar.barTintColor = UIColor(displayP3Red: 0/255, green: 150/255, blue: 136/255, alpha: 1.0) let searchController = UISearchController(searchResultsController: nil) // Search Controller navigationItem.hidesSearchBarWhenScrolling = false navigationItem.searchController = searchController 

你可以find一个UISearchBarController的例子 – SearchBar和范围button重叠在这里 。