iOS:搜索栏显示在导航栏中时隐藏的范围栏

时间:2014-12-29 22:39:40

标签: ios iphone

我试图在导航栏中显示搜索栏及其范围,就像视图首次显示的方式一样。如果您只是将UISearchBar拖到界面构建器中的表视图控制器上,它就像标题单元格一样放在您的表中。然后,当你点击它时,它会动画到下面的I< m。问题是我希望它在没有任何敲击的情况下以这种方式开始,左侧有一个后退按钮,右侧没有取消按钮:

enter image description here

因此,为了在不点击的情况下立即关注搜索栏,我尝试在viewDidLoad中添加[_searchBar becomeFirstResponder];,但这并不起作用。接下来我尝试了:

self.searchDisplayController.displaysSearchBarInNavigationBar = YES;

搜索栏确实会显示在导航栏中但是范围栏已经消失了(为什么APPLE为什么)并且存在一个尴尬的差距。

enter image description here

我还试过继承UINavigationBar并使其更高。它很容易改变它的大小,但内容在条形图的底部对齐并重叠您尝试添加到其中的任何内容。

因此,为了重新迭代,我需要在视图首次出现时使用范围控件在导航栏中显示搜索栏,而不需要用户点击。我还应该指定这是在UITableViewController上(因为页面有一个UIRefreshConrol),所以简单地将工具栏放在表视图上方不是一个选项。感谢。

1 个答案:

答案 0 :(得分:4)

tl; dr: Don&#tt。

您应该知道向UISearchBar的{​​{1}}添加headerView会在UITableView中调用一些自定义代码,以便在开始时隐藏范围栏。虽然过去更容易在iOS 6及更早版本中显示范围栏,但iOS 7已经改变了这一点。

UIKitbecomeFirstResponder的第一种方法是个好主意,但是在将视图加载到内存(例如NIB之外)后调用此方法。视图尚未添加到视图层次结构中,因此它无法成为第一个响应者。 视图加载到视图层次结构后,viewDidLoad被称为,而viewDidAppear:确实允许becomeFirstResponder获得焦点。

范围栏本身是UISearchBar的隐藏(默认情况下)子视图。从技术上讲,您可以循环浏览子视图并将其设置为不隐藏:

UISearchBar

这通常是一个坏主意。有一个基本的检查,看看目标子视图是包含范围栏的子视图,但是可能会破坏任何秒,可能不会向后兼容等等。

你必须问自己的真正问题是为什么我是否希望范围栏始终可见?它现在的工作方式,当用户点击搜索字段时,范围栏将显示动画,并在搜索字段不再具有焦点时隐藏自身。即使是" hack"上面,一旦用户点击范围按钮,搜索栏就会获得焦点。当搜索甚至没有活动时,显示搜索选项的重点是什么?如果有疑问,会回到Apple的建议。从长远来看,它会让您的生活变得更轻松,并且可能会使您的应用看起来更好。 Apple并没有随心所欲地添加这种互动。他们疯狂地测试了它。这就是为什么让它以另一种方式工作如此困难的原因。这就是为什么当- (void)viewDidLoad { [super viewDidLoad]; [self recurseSubviewsForView:self.searchDisplayController.searchBar]; } - (void)recurseSubviewsForView:(UIView *)view { for (UIView *subview in view.subviews) { if ((CGRectGetMinY(subview.frame) == CGRectGetMaxY(self.searchDisplayController.searchBar.frame)) && subview.hidden) { subview.hidden = NO; self.searchDisplayController.searchBar.showsScopeBar = YES; [self.searchDisplayController.searchBar sizeToFit]; } [self recurseSubviewsForView:subview]; } } UISearchBar的{​​{1}}时,会运行特殊代码的原因...因为它对用户来说可能更好。

此外,我看到您的屏幕截图定位到iOS 8,但您的代码剪切显示使用headerView。这种范例已被弃用,有利于UISearchController。请考虑更新。