为啥我的 UITableView 滚动偏移在返回其视图时最终落在 UISearchController 后面?
Posted
技术标签:
【中文标题】为啥我的 UITableView 滚动偏移在返回其视图时最终落在 UISearchController 后面?【英文标题】:Why does my UITableView scroll offset end up behind the UISearchController when returning to its view?为什么我的 UITableView 滚动偏移在返回其视图时最终落在 UISearchController 后面? 【发布时间】:2019-10-17 07:49:32 【问题描述】:Xcode 11.1、ios 13.1
我很难弄清楚为什么 TableView 单元格最终会出现在搜索栏后面。
我的设置:
override func viewDidLoad()
// Setup Eureka's UITableViewStyle to `Plain` (like 'Contacts' app)
// https://github.com/xmartlabs/Eureka/issues/218
if tableView == nil
tableView = UITableView(frame: view.bounds, style: UITableView.Style.plain)
tableView?.autoresizingMask = UIView.AutoresizingMask.flexibleWidth.union(.flexibleHeight)
tableView.cellLayoutMarginsFollowReadableWidth = false
// *now* call super.
super.viewDidLoad()
// Add search bar
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
definesPresentationContext = true
// Place the search bar in the navigation bar.
self.navigationItem.searchController = self.searchController
self.navigationItem.hidesSearchBarWhenScrolling = false
【问题讨论】:
请展示您如何设置 tableView 的约束。您需要将 tableView 的 topAnchor 设置为 safeAreaTopAnchor @EneaDume 这个VC是程序化创建的,我其实没有配置任何约束。 我们需要看看tableView是如何创建的 如何在VC上添加这个tableView @EneaDume 它只是继承而来,因为我正在使用为我设置 UITableView 和单元格的Eureka
框架。 github.com/xmartlabs/Eureka
【参考方案1】:
在tableView = UITableView(frame: view.bounds, style: UITableView.Style.plain)
之后添加以下约束
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
tableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 0).isActive = true
tableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: 0).isActive = true
tableView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: 0).isActive = true
【讨论】:
*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to activate constraint with anchors <NSLayoutYAxisAnchor:0x60000077cd00 "UITableView:0x7fdeb0873000.top"> and <NSLayoutYAxisAnchor:0x600000776600 "UILayoutGuide:0x600002742060'UIViewSafeAreaLayoutGuide'.top"> because they have no common ancestor. Does the constraint or its anchors reference items in different view hierarchies? That's illegal.'
我改用:tableView.tableHeaderView = searchController.searchBar
,并在viewWillLayoutSubviews
中添加了您的代码。将搜索栏放在导航栏中变得太成问题了。
navigationItem.searchController = searchController
应该可以工作。【参考方案2】:
在 iOS 12 和 13 上进行了无数次测试后,因为我得到了不同的 UX 结果,我发现了这个:https://***.com/a/57861125/7599
结果:(使用Snapkit)
extendedLayoutIncludesOpaqueBars = true
self.tableView.snp.remakeConstraints make -> Void in
make.top.equalToSuperview()
make.leading.equalTo(self.view.safeAreaLayoutGuide.snp.leading)
make.trailing.equalTo(self.view.safeAreaLayoutGuide.snp.trailing)
make.bottom.equalToSuperview()
【讨论】:
以上是关于为啥我的 UITableView 滚动偏移在返回其视图时最终落在 UISearchController 后面?的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我滚动浏览 UITableView 时图像会不断调整大小?
为啥我的 UITableView 没有出现在正确的滚动位置?