繁体   English   中英

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

[英]iOS: Scope bar hidden when search bar is displayed in navigation bar

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

在此输入图像描述

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

self.searchDisplayController.displaysSearchBarInNavigationBar = YES;

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

在此输入图像描述

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

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

tl;博士: 不要。

您应该知道将UISearchBar添加到UITableViewheaderView调用UIKit中的一些自定义代码,这有助于在开始时隐藏范围栏。 虽然过去更容易在iOS 6及更早版本中显示范围栏,但iOS 7已经改变了这一点。

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

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

- (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];
    }
}

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

你必须问自己的真正问题是为什么我希望示波器栏始终可见? 它现在的工作方式,当用户点击搜索字段时,范围栏将显示动画,并在搜索字段不再具有焦点时隐藏自身。 即使上面有“hack”,只要用户点击范围按钮,搜索栏就会获得焦点。 当搜索甚至没有活动时,显示搜索选项有什么意义? 如果有疑问,请回到Apple的建议。 从长远来看,它将使您的生活更轻松,并可能使您的应用看起来更好。 Apple并不只是随心所欲地添加这种互动。 他们疯狂地测试了它。 这就是为什么让它以另一种方式工作是如此困难。 这就是当UISearchBarUITableViewheaderView时运行特殊代码的原因...因为它对用户来说可能更好。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM