tableView Header 中的 iOS 11 搜索栏在焦点上跳转到屏幕顶部

Posted

技术标签:

【中文标题】tableView Header 中的 iOS 11 搜索栏在焦点上跳转到屏幕顶部【英文标题】:iOS 11 search bar in tableViewHeader jumps to the top of the screen on focus 【发布时间】:2017-09-26 07:24:28 【问题描述】:

关于此主题here 和here 已有 2 个未答复的帖子,其中没有人提供解决此问题的有效解决方案。

第一张图片显示了 ios 10 搜索控制器的行为,您可以在其中看到左侧的层次结构,右侧的搜索控制器框架以红色框出。蓝色中心的视图是表格中正确显示的视图。

第二张图片显示了 iOS 11 的行为,其中搜索控制器退出 tableView 标头的边界,并移动到没有意义的屏幕顶部,因为表格视图位于距屏幕顶部 230 像素处。

我用来显示所有这些的代码如下(在 viewDidLoad 中):

self.definesPresentationContext = YES;
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.dimsBackgroundDuringPresentation = NO;
self.searchController.searchBar.delegate = self;
self.searchController.searchBar.clipsToBounds = YES;
self.tableView.tableHeaderView = self.searchController.searchBar;
self.searchController.searchBar.placeholder = @"Enter name or email";
[self.searchController.searchBar sizeToFit];

【问题讨论】:

【参考方案1】:

从 iOS11 开始,搜索控件是导航栏的一部分。您将需要以下内容

Objective-C if (@available(iOS 11.0, *)) self.navigationItem.searchController = searchController else self.tableView.tableHeaderView = searchController.searchBar

斯威夫特

if #available(iOS 11.0, *) 

【讨论】:

而且他们完全放弃了对用于搜索栏的 tableView 标题部分的支持?我看到它一直有效,直到它按预期集中。有任何文档参考可以证明这一说法吗? 这并不是说标题视图已从表中删除,但现在应该在导航项中实现搜索。请参阅此 WWDC 演讲 Updating Your App for iOS 11 幻灯片第 23 页。 这是 Apple 推荐的,但并不总是有效:iOS11 UISearchBar missing in UINavigationBar when embedded in UISplitViewController。您仍然可以使用 tableHeaderView,但必须进行一些调整...Using UISearchController with UISearchBar in tableHeaderView in iOS11【参考方案2】:

这是来自情节提要的视图控制器中的 tableView 的约束。

 var tableConstraints: [NSLayoutConstraint]  
            var constraints = [NSLayoutConstraint]()
            constraints.append(NSLayoutConstraint(item: self.tableViewMyMedia, attribute: .left, relatedBy: .equal,
                                                  toItem: self.view, attribute: .left, multiplier: 1.0, constant: 1.0))
            constraints.append(NSLayoutConstraint(item: self.tableViewMyMedia, attribute: .right, relatedBy: .equal,
                                                  toItem: self.view, attribute: .right, multiplier: 1.0, constant: 1.0))
            constraints.append(NSLayoutConstraint(item: self.tableViewMyMedia, attribute: .top, relatedBy: .equal,
                                                  toItem: self.view, attribute: .top, multiplier: 1.0, constant: 1.0))
            constraints.append(NSLayoutConstraint(item: self.tableViewMyMedia, attribute: .bottom, relatedBy: .equal,
                                                  toItem: self.view, attribute: .bottom, multiplier: 1.0, constant: 1.0))
            return constraints
        

现在添加搜索栏并像这样添加这个约束

  let search = UISearchController(searchResultsController: nil)
            search.searchResultsUpdater = self
            self.navigationItem.searchController = search
            NSLayoutConstraint.activate(tableConstraints) // important

检查一下,上下滚动时它没有跳跃。

【讨论】:

【参考方案3】:

尝试使用

searchController.hidesNavigationBarDuringPresentation = NO;

结果会让你大吃一惊!

【讨论】:

以上是关于tableView Header 中的 iOS 11 搜索栏在焦点上跳转到屏幕顶部的主要内容,如果未能解决你的问题,请参考以下文章

ios tableView的header高度不对

ios 设置tableview header不刷新

iOS UITableView ExpandableHeader(可形变的Header)

iOS中tableView每一个section的header的悬浮位置的解决

TableView Header 中的程序化 UIView

试图理解 tableView 的自定义部分 Header 中的 .layoutMarginsGuide 时感到困惑