【问题标题】:iOS 11 Extra Space on NavigationBar导航栏上的 iOS 11 额外空间
【发布时间】:2018-01-08 12:29:56
【问题描述】:

我将我的 searchBar 代码更改为:

self.navigationItem.titleView = searchNavigation.searchController.searchBar;

到:

if (@available(iOS 11.0, *)) {
    self.navigationItem.searchController = searchNavigation.searchController;
    self.navigationController.navigationBar.prefersLargeTitles = NO;
    self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever;
} else {
    self.navigationItem.titleView = searchNavigation.searchController.searchBar;
}

但在 ios 11 上尝试时看起来像

searchBar 上有额外的空间,当我开始输入它的顶部幻灯片时,看起来很正常

【问题讨论】:

  • 我不记得在哪里,但我读到有人为此问题添加了 hack,self.navigationItem.searchController?.searchBar.resignFirstResponder() self.navigationItem.searchController?.searchBar.becomeFirstResponder() 在 vi​​ewWillAppear 中添加以上两行代码应该可以工作

标签: swift autolayout uinavigationbar ios11


【解决方案1】:

首先对于 iOS 11,您将搜索控制器分配给导航项 searchController 属性,而不是它的 titleView。如果您这样做,搜索栏就会出现在导航栏下方,如您所见。

其次,UISearchController 上有一个名为hidesNavigationBarDuringPresentation 的属性,它控制搜索栏在使用时是否向上移动以隐藏导航栏。

要为 iOS 11 复制以前版本的内容,请改为:

if (@available(iOS 11.0, *)) {
    self.navigationItem.titleView = 
    searchNavigation.searchController.searchBar;   
    searchNavigation.searchController.hidesNavigationBarDuringPresentation = NO;
    self.navigationController.navigationBar.prefersLargeTitles = NO;
    self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever;
} else {
    self.navigationItem.titleView = 
    searchNavigation.searchController.searchBar;
}

【讨论】:

  • 我使用了hidesNavigationBarDuringPresentation ,但searchBar 上仍有空间。无论如何要删除这个空间。我尝试了您发布的代码,但它对我不起作用。
  • 您是否也为 iOS 11 更改了它以将其分配给 searchNavigation.titleView 而不是 searchNavigation.searchController。如果您使用 searchNavigation.searchController,那么搜索栏会放在导航栏下方。
【解决方案2】:

正如之前的答案所提到的,将导航栏的 searchController 设置为所需的搜索栏将生成位于导航栏新“大标题”下方的搜索栏。

要停止这种新行为,您需要使用搜索栏本身覆盖导航栏的titleView,并禁用搜索控制器的动画,该动画会在输入开始后隐藏大标题。可以这样做:

navigationItem.titleView = searchController.searchBar
searchController.hidesNavigationBarDuringPresentation = false

【讨论】: