29

我正在尝试使用UISearchControlleriOS 8 中的新功能,并将其嵌入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,显然看起来很奇怪。

我应该怎么做?

4

1 回答 1

23

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

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

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

由于您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:了代码来处理你想要的转换。

  • 如果您想始终看到searchBarand scopeBar,您可能不得不放弃使用内置的scopeBar,并将其替换UISegmentedControl为用户将始终看到的 a ,即使搜索控制器未激活也是如此。

更新:

这个答案建议子类UISearchController化以改变其搜索栏的高度。

于 2015-01-17T00:25:36.643 回答