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 UITableView ExpandableHeader(可形变的Header)