我尝试使用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
后面的按钮,显然看起来很奇怪。
我该怎么做?
答案 0 :(得分:22)
你正在进入一个设计问题&#34; <{1}}未激活时,scopeBar
预计会被隐藏的位置。
示波器栏按钮显示在搜索栏的后面(下方),因为它是搜索栏变为活动状态时的位置,并将其自身动画到导航栏中。
当搜索未激活时,可见范围栏会占用屏幕上的空间,分散内容,并使用户感到困惑(因为范围按钮没有结果可以过滤)。
由于searchController
已经位于titleView中,因此显示范围栏的(导航和搜索)栏动画不会发生。
searchBar
动画显示标题
激活区域。导航栏将为其高度设置动画,
腾出空间来包含隐藏的范围栏。这将是全部
由搜索控制器处理。第二个选项,几乎一样简单,就是使用搜索栏按钮
图标,它会将searchBar
和searchBar
设置为动画
查看导航栏。
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的高度。