如何在 iOS 8 中使用 UISearchController,其中 UISearchBar 在我的导航栏中并且有范围按钮?

Posted

技术标签:

【中文标题】如何在 iOS 8 中使用 UISearchController,其中 UISearchBar 在我的导航栏中并且有范围按钮?【英文标题】:How do I use UISearchController in iOS 8 where the UISearchBar is in my navigation bar and has scope buttons? 【发布时间】:2015-01-10 18:59:31 【问题描述】:

我正在尝试使用 ios 8 中的新 UISearchController,并将其 UISearchBar 嵌入到我的 UINavigationBar 中。这很容易做到,如下所示:

searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.delegate = self
searchController.searchBar.delegate = self
searchController.dimsBackgroundDuringPresentation = false
searchController.hidesNavigationBarDuringPresentation = false
navigationItem.titleView = searchController.searchBar

但是当我添加范围按钮时:

searchController.searchBar.showsScopeBar = true
searchController.searchBar.scopeButtonTitles = ["Posts, Users, Subreddits"]

它在UISearchBar后面添加了按钮,显然看起来很奇怪。

我应该怎么做?

【问题讨论】:

你能提供一个快照吗? 我遇到了同样的问题。似乎 UISearchController 不太理解 UISearchBar 位于导航栏内的想法。甚至苹果的示例似乎都将 searchBar 放在导航栏下方。 你用的是哪个版本,这个问题在 beta 3 n 4. 如果需要请点击此源链接,它应该有助于raywenderlich.com/16873/how-to-add-search-into-a-table-view 【参考方案1】:

您遇到了一个“设计问题”,当searchController 未激活时,scopeBar 预计会被隐藏。

范围栏按钮出现在搜索栏的后面(下方),因为这是搜索栏变为活动状态并将其自身设置为导航栏时的位置。

当搜索未激活时,可见的范围栏会占用屏幕上的空间,分散内容的注意力,并使用户感到困惑(因为范围按钮没有要过滤的结果)。

由于您的 searchBar 已经位于 titleView 中,因此不会出现显示范围栏的(导航和搜索)栏动画。

最简单的选项是找到下面的搜索栏 导航栏,然后让searchBar 动画到标题中 激活时的区域。导航栏将为其高度设置动画, 腾出空间来包含隐藏的范围栏。这都会 由搜索控制器处理。

第二个选项几乎同样简单,就是使用搜索栏按钮 图标,它将使searchBarscopeBar 向下移动到 查看导航栏。

- (IBAction)searchButtonClicked:(UIBarButtonItem *)__unused sender 
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    self.searchController.searchResultsUpdater = self;
    self.searchController.hidesNavigationBarDuringPresentation = NO;
    self.searchController.dimsBackgroundDuringPresentation = NO;
    self.definesPresentationContext = YES;
    self.searchController.searchBar.scopeButtonTitles = @[@"Posts", @"Users", @"Subreddits"];
    [self presentViewController:self.searchController animated:YES completion:nil];

如果你想让searchBar 保留在titleView 中,一个动画 做你想做的事不是内置的。你必须自己动手 处理导航栏高度变化并显示您自己的代码 范围栏(或挂钩到内部,并动画内置 scopeBar 向下进入视野)。

如果你很幸运,其他人已经编写了willPresentSearchController: 代码来处理你想要的转换。

1234563看看,即使搜索控制器未激活。

更新:

This answer 建议子类化UISearchController 以更改其搜索栏的高度。

【讨论】:

第二个选项很棒(尤其是 searchController 的 presentViewController 部分)

以上是关于如何在 iOS 8 中使用 UISearchController,其中 UISearchBar 在我的导航栏中并且有范围按钮?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 8 中使用 UIAlertView? [复制]

如何在 iOS 8 中使用带有 NSNotificationCenter 的小部件

如何在 iOS 8 中使用自动布局和自动调整单元格大小

如何在 iOS 8 中告诉目标 interfaceOrientation?

如何在 iOS 8 中执行“actionSheet showFromRect”?

如何在使用 Swift 在 iOS 8 中播放电影时旋转 MPMoviePlayer?