UISearchBarController iOS 11问题-搜索栏和范围按钮重叠
转介及。第一个环节没有答案。在第二个链接中,虽然答案不被接受,但苹果开发者论坛的链接给出了错误 在iOS 11之前: 监督厅11: 注意:相同的设备相同的代码。UISearchBarController iOS 11问题-搜索栏和范围按钮重叠,ios,swift,uisearchcontroller,Ios,Swift,Uisearchcontroller,转介及。第一个环节没有答案。在第二个链接中,虽然答案不被接受,但苹果开发者论坛的链接给出了错误 在iOS 11之前: 监督厅11: 注意:相同的设备相同的代码。 此外,这意味着,所有使用此功能的应用程序都必须重新发布?在Ray Wenderlich提交的雷达中,@benck从WWDC发布了此信息,如果我没有弄错的话,它还没有发布。根据您的评论,您的UISearchController的UISearchBar已分配给您的UITableView的tableHeaderView。在iOS 11中,
此外,这意味着,所有使用此功能的应用程序都必须重新发布?在Ray Wenderlich提交的雷达中,@benck从WWDC发布了此信息,如果我没有弄错的话,它还没有发布。根据您的评论,您的
UISearchController
的UISearchBar
已分配给您的UITableView
的tableHeaderView
。在iOS 11中,您应该将UISearchController
分配给视图的navigationItem
的searchController
属性。您不再需要将ui搜索栏分配到任何位置。请参阅此新属性。我在我的应用程序中遇到了相同的问题,我的解决方案是在iOS 11中,使用苹果建议的新方式搜索栏(位于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)
}
我有两个IBoutlet:searchView和searchViewHeight:
@IBOutlet var searchView: UIView!
@IBOutlet var searchViewHeight: NSLayoutConstraint! // new added for iOS 11
在iOS 11之前,我的viewController的层次结构如下所示:
if #available(iOS 11.0, *) {
navigationController?.navigationBar.prefersLargeTitles = false
navigationItem.searchController = searchController
navigationItem.hidesSearchBarWhenScrolling = false
searchViewHeight.constant = 0
} else {
searchView.addSubview(searchController.searchBar)
}
我有一个高度为44的searchView,其中包含我的searchController的searchBar视图。在导航栏下面
在ios11中,我为searchView的高度约束添加了一个新的IBOutlet,并将其常量设置为0,隐藏这个容器视图。并将searchController添加为导航项的一部分
见苹果的文件:
还有一件事是在iOS 11下,默认情况下搜索栏的文本字段背景颜色比导航栏颜色略暗。为了保持一致性,您可以将其更改为白色,以下代码适用于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中正确显示初始外观:
但是,如果应用程序是后台的,然后在搜索栏处于活动状态时恢复,则外观会重叠,如上面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];
}];
(在搜索栏处于活动状态时,我仍在研究如何解决界面方向发生变化后的布局问题-这仍然会导致重叠。)我认为解决方案是在导航栏中添加搜索栏:
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
您可以找到UISearchBarController的一个示例—搜索栏和范围按钮重叠。我在iOS 11中也遇到过同样的问题。
与这里的一些评论相反,如果我查看您的屏幕截图,您不想将其设置为navigationItem
,因为您没有UINavigationController
设置
您也不想在表视图的标题中添加搜索栏
,因为出于某种原因,它无法处理范围栏
那么我做了什么来修复它:
若要获取作用域位于表视图上的UISearchBar
,请在interface builder中使用UIViewController
,而不是UITableViewController
将ui搜索栏
和ui表格视图
放置在视图控制器内,并将其正确连接(代理、数据源等)
不要忘记将swift文件更改为UIViewController
,而不是UITableViewController
,并相应地进行更改。(添加tableView属性并通过IBOutlet连接,更改tableView的代理等)
然后在interface builder中,使用自动布局指南,使搜索栏
位于表格视图
在interface builder中,当您激活范围栏时,它看起来会非常奇怪,但不要惊慌,它会很好。我猜当苹果公司改变了界面生成器的行为以使用UINavigationController
时,他们把界面生成器的渲染搞砸了。。。无论如何
然后一切都按它应该的方式运行,看起来是这样的(在我的例子中,我在popover中向vc展示了它,但这并不重要)
请看一次@Anbu.Karthik此链接由NitishTry以self.definesPresentationContext=true附加在您的viewDIdload@TofaaniKaanudo:导航栏中已经有搜索栏了吗?或者在viewcontroller中没有导航栏?对我来说也是固定的。我只是将SearchController添加到tableView中,而没有有条件地检查iOS 11。它必须链接到iOS 11 SDK,但是,当链接到iOS 10 SDK时,此方法不起作用。对于iOS 11,这里排名第一的答案是:是方法。