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

标签 ios iphone

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

enter image description here

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

self.searchDisplayController.displaysSearchBarInNavigationBar = YES;

搜索栏确实会显示在导航栏中,但范围栏不见了,(WHY APPLE WHY) 并且有一个尴尬的差距。

enter image description here

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

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

最佳答案

tl;dr: 不要。

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

您的第一种方法,在 viewDidLoadbecomeFirstResponder 是个好主意,但此方法在 View 加载到内存后调用(例如从 NIB 中加载).该 View 还没有被添加到 View 层次结构中,所以它不能成为第一响应者。 viewDidAppear: 在 View 加载到 View 层次结构中后 立即调用,becomeFirstResponder 实际上允许 UISearchBar 接收焦点。

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

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

这通常是个坏主意。有一个基本检查来查看目标 subview 是否是包含范围栏的 subview ,但这可能随时中断,可能不向后兼容等。

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

此外,我看到你的屏幕截图针对的是 iOS 8,但你的代码片段显示使用 UISearchDisplayController。此范例已被弃用,取而代之的是 UISearchController .请考虑更新。

关于iOS:在导航栏中显示搜索栏时隐藏范围栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27697065/

相关文章:

iphone - Objective-C DRY JSON 映射和对象创建

ios - fatal error : 'Flutter/Flutter.h' file not found in flutter

ios - 导航栏在 iOS 13 中无法正常显示

iphone - 从现在起测量时间间隔

iphone - 有哪位iOS高级用户知道下面的iOS流程是什么吗?

ios - 如何以编程方式设置设备(UI)方向?

iphone - 从桌面下载比直接互联网下载更快?

ios - 如何在 UITableView 中按字母顺序对字典数组进行排序和分类,作为 swift 3.0 中的部分

iphone - UIToolbar调整大小导致横向中的UIBarButtonItem大小奇怪

ios - UIColor 不适用于 RGBA 值