UISearchBarController的iOS 11问题 – search栏和范围button重叠
这里和这里提到。 第一个链接没有答案。 在第二个链接,虽然答案不被接受,但链接到苹果开发者论坛给出了错误。
在iOS 11之前:
iOS 11:
注意 :相同的设备相同的代码。
另外,这意味着,所有使用此function的应用程序都必须重新发布?
在Ray Wenderlich提交的雷达中,@benck从WWDC发布了这个答案 ,如果我没有弄错的话,还没有发布。
根据你的意见,你的UISearchController
的UISearchBar
已经分配给你的UITableView
的tableHeaderView
。 在iOS 11中,您应该将您的UISearchController
分配给视图的navigationItem
的searchController
属性。 您不再需要在任何地方分配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,它的高度是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重叠在这里 。