如何在iOS 8中使用UISearchController,其中UISearchBar位于导航栏中并具有范围按钮?

时间:2015-01-10 18:59:32

标签: ios uinavigationcontroller ios8 uisearchbar uisearchcontroller

我尝试使用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后面的按钮,显然看起来很奇怪。

我该怎么做?

1 个答案:

答案 0 :(得分:22)

你正在进入一个设计问题&#34; <{1}}未激活时,scopeBar预计会被隐藏的位置。

示波器栏按钮显示在搜索栏的后面(下方),因为它是搜索栏变为活动状态时的位置,并将其自身动画到导航栏中。

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

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

  • 最简单选项是找到位于下方的搜索栏 导航栏,让searchBar动画显示标题 激活区域。导航栏将为其高度设置动画, 腾出空间来包含隐藏的范围栏。这将是全部 由搜索控制器处理。
  • 第二个选项,几乎一样简单,就是使用搜索栏按钮 图标,它会将searchBarsearchBar设置为动画 查看导航栏。

    scopeBar
  • 如果您希望- (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]; }保留在titleView中,则为动画 做你想做的事情并不是内置的。你必须自己动手 用于处理navigationBar高度更改并显示您自己的代码 范围栏(或挂钩到内部,并为内置动画设置动画 searchBar向下看到。)

    如果您有幸,其他人已经编写了scopeBar代码来处理您想要的转换。

  • 如果您希望始终看到willPresentSearchController:searchBar,您可能不得不使用内置scopeBar,并将其替换为用户将始终看到的scopeBar,即使搜索控制器未处于活动状态。

<强>更新

This answer建议继承UISegmentedControl以更改其searchBar的高度。