如何在 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
动画到标题中
激活时的区域。导航栏将为其高度设置动画,
腾出空间来包含隐藏的范围栏。这都会
由搜索控制器处理。
第二个选项几乎同样简单,就是使用搜索栏按钮
图标,它将使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];
如果你想让searchBar
保留在titleView 中,一个动画
做你想做的事不是内置的。你必须自己动手
处理导航栏高度变化并显示您自己的代码
范围栏(或挂钩到内部,并动画内置
scopeBar
向下进入视野)。
如果你很幸运,其他人已经编写了willPresentSearchController:
代码来处理你想要的转换。
更新:
This answer 建议子类化UISearchController
以更改其搜索栏的高度。
【讨论】:
第二个选项很棒(尤其是 searchController 的presentViewController
部分)以上是关于如何在 iOS 8 中使用 UISearchController,其中 UISearchBar 在我的导航栏中并且有范围按钮?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 8 中使用 UIAlertView? [复制]
如何在 iOS 8 中使用带有 NSNotificationCenter 的小部件
如何在 iOS 8 中告诉目标 interfaceOrientation?