导航栏中的iOS 11 SearchBar

在iOS 11中,苹果公司重新devise了UISearchBar,使angular落更圆,高度更大。 将UISearchBar添加到navigationBar非常简单,只需使用navigationItem.titleView = searchBar将其设置为navigationItem.titleView = searchBar

不过,在iOS 11中,它似乎不像预期的那样工作。 看看我们使用iOS 10和iOS 11比较相同设置的屏幕

iOS 10 在这里输入图像说明

iOS 11 在这里输入图像说明

您可以清楚地看到,SearchBar增加了NavigationBar的大小,但是栏button没有正确alignment。 此外,searchBar不再使用左侧的可用空间。

将searchBar放到一个包装视图中以获取iPad上的取消button,如下所述取消button不会显示在UISearchBar中,因为searchBar根本不可见,所以似乎也不再适用了。

如果任何人有类似的问题,或已经知道如何修复/改善,我会非常感激。

这是使用Xcode 9 Beta 4构build的。也许以后的版本将解决这个问题。

更新:

我们现在决定使用下面的解决scheme:我们在NavBar中添加了一个新的UIBarButtonItem,当用户按下这个button时,我们将展示一个新的ViewController,我们只把一个SearchBar放到NavBar中, 。 使用选定的答案可能是最好的解决scheme。

iOS 11中的navigationItem上有一个新的searchController属性。

https://developer.apple.com/documentation/uikit/uinavigationitem/2897305-searchcontroller

像这样使用…

 if #available(iOS 11.0, *) { navigationItem.searchController = searchController } else { // Fallback on earlier versions navigationItem.titleView = searchController?.searchBar } 

在Objective-C中,if语句如下所示:

 if (@available(iOS 11.0, *)) { 

在iOS 11上,如果您未设置navigationItem.hidesSearchBarWhenScrolling = false ,则search栏最初可能会隐藏,除非用户向下滚动以显示它。 如果将它设置为false,它将显示在标题所在的位置,而不需要用户滚动。

您可以通过添加高度为44的约束来更改iOS 11中UISearchBar的高度:

 if #available(iOS 11.0, *) { searchBar.heightAnchor.constraint(equalToConstant: 44.0).isActive = true } 

我遇到了同样的问题,经过几天的search,我发现这个网页 – https://translate.google.com/translate?hl=zh-CN&sl=zh-CN&u=http://www.jianshu.com/ p / 262f6e34a7d3&prev =search 。

这个页面导致这个git回购 – https://github.com/DreamTravelingLight/searchBarDemo – 这个演示项目演示如何使用titleView的旧方式仍然有一个没有大小问题的searchBar。

关键是这些

 _searchBar = [self addSearchBarWithFrame:CGRectMake(0, 0, kScreenWidth - 2 * 44 - 2 * 15, 44)]; UIView *wrapView = [[UIView alloc] initWithFrame:_searchBar.frame]; [wrapView addSubview:_searchBar]; self.navigationItem.titleView = wrapView; 

如果将UISearchBarembedded到视图中,并将该视图设置为titleView,则UISearchBar将具有您为其设置的大小,并且将按照预期匹配导航栏。

谢谢,大卫

我想你必须处理设置新的UINavigationItem.searchController属性到你的UISearchController对象。 这就是你如何在消息中看到新的效果。 它看起来像旧的行为是完全没有了。 我希望我错了,但整个API得到了11次大修。我知道这是一般的bug,所以如果这个问题得到解决,我们会看到更新的beta和GM。 (在Beta 6时写)