UISearchController.hidesNavigationBarDuringPresentation 在 iOS 11 Beta 中被 scopeButtons 忽略
UISearchController.hidesNavigationBarDuringPresentation ignored with scopeButtons in iOS 11 Beta
在我们的项目中,我们指定
hidesNavigationBarDuringPresentation = false
在特定 UIViewController
的 UISearchController
上。 searchController 有一个范围标题数组。到目前为止,这在 iOS 10 之前工作正常,但在 iOS 11 测试版中,似乎忽略了 hidesNavigationBarDuringPresentation 的错误设置并弄乱了我们的显示。为了确保它不是因为我的项目中的其他因素,我创建了一个 bare-bone 测试项目,其中只有一个 UITableViewController
,UISearchController
用另一个简单的 UITableViewController
初始化。以下代码位于主视图控制器的 viewDidLoad()
方法中:
self.title = "Search Bar Scope Test"
let searchViewController = SearchViewController(style: .plain)
searchController = UISearchController(searchResultsController: searchViewController)
searchController!.searchBar.sizeToFit()
tableView.tableHeaderView = searchController!.searchBar
searchController?.hidesNavigationBarDuringPresentation = false
searchController?.searchBar.scopeButtonTitles = ["scope 1", "scope 2", "scope 3", "scope 4", "scope 5"]
当分配 scopeButtonTitles
的最后一行不存在时,导航栏不会隐藏,搜索栏保持在其原始位置。然而,随着该行的出现,NavigationBar
被隐藏并且 searchBar
加上范围按钮在 iPhone 和 iPad 上都以纵向模式向上移动,但保持不变在横向模式下(即使范围按钮很多并且不能放在一行中)。
其他人遇到过这个吗?这是 iOS 11 中的错误或预期行为(当然不是我们期望的行为),是否有任何解决方法?
谢谢!
好的,我在研究另一个相关问题时找到了问题的原因, searchBar
和范围按钮在 iOS 11 中没有对齐。关键是 searchController配置方案在 iOS 11 中发生了变化,其中 searchBar
不应再显示为 tableView's
headerView
,相反,整个 searchController 应该是 navigationItem
的一部分,如下图:
if #available(iOS 11.0, *) {
self.navigationItem.searchController = searchController
// optional, but apparently due to a bug in iOS 11,
// the searchBar and the scope buttons may get too high and mis-aligned
// when the nav bar is hidden
searchController?.hidesNavigationBarDuringPresentation = false
} else {
tableView.tableHeaderView = searchController!.searchBar
}
上面的代码解决了我在 iOS 11 中与 UISearchBar 相关的一些 UI 问题,并且实际上在 this WWDC 2017 video 中被推荐,但我多么希望如果 Xcode 可以在旧的 tableHeaderView 分配行给我们一个警告,它会节省我和其他一些开发人员的困惑和研究时间。
在我们的项目中,我们指定
hidesNavigationBarDuringPresentation = false
在特定 UIViewController
的 UISearchController
上。 searchController 有一个范围标题数组。到目前为止,这在 iOS 10 之前工作正常,但在 iOS 11 测试版中,似乎忽略了 hidesNavigationBarDuringPresentation 的错误设置并弄乱了我们的显示。为了确保它不是因为我的项目中的其他因素,我创建了一个 bare-bone 测试项目,其中只有一个 UITableViewController
,UISearchController
用另一个简单的 UITableViewController
初始化。以下代码位于主视图控制器的 viewDidLoad()
方法中:
self.title = "Search Bar Scope Test"
let searchViewController = SearchViewController(style: .plain)
searchController = UISearchController(searchResultsController: searchViewController)
searchController!.searchBar.sizeToFit()
tableView.tableHeaderView = searchController!.searchBar
searchController?.hidesNavigationBarDuringPresentation = false
searchController?.searchBar.scopeButtonTitles = ["scope 1", "scope 2", "scope 3", "scope 4", "scope 5"]
当分配 scopeButtonTitles
的最后一行不存在时,导航栏不会隐藏,搜索栏保持在其原始位置。然而,随着该行的出现,NavigationBar
被隐藏并且 searchBar
加上范围按钮在 iPhone 和 iPad 上都以纵向模式向上移动,但保持不变在横向模式下(即使范围按钮很多并且不能放在一行中)。
其他人遇到过这个吗?这是 iOS 11 中的错误或预期行为(当然不是我们期望的行为),是否有任何解决方法?
谢谢!
好的,我在研究另一个相关问题时找到了问题的原因, searchBar
和范围按钮在 iOS 11 中没有对齐。关键是 searchController配置方案在 iOS 11 中发生了变化,其中 searchBar
不应再显示为 tableView's
headerView
,相反,整个 searchController 应该是 navigationItem
的一部分,如下图:
if #available(iOS 11.0, *) {
self.navigationItem.searchController = searchController
// optional, but apparently due to a bug in iOS 11,
// the searchBar and the scope buttons may get too high and mis-aligned
// when the nav bar is hidden
searchController?.hidesNavigationBarDuringPresentation = false
} else {
tableView.tableHeaderView = searchController!.searchBar
}
上面的代码解决了我在 iOS 11 中与 UISearchBar 相关的一些 UI 问题,并且实际上在 this WWDC 2017 video 中被推荐,但我多么希望如果 Xcode 可以在旧的 tableHeaderView 分配行给我们一个警告,它会节省我和其他一些开发人员的困惑和研究时间。