为啥把uitableview视图增加到uiscrollview视图上出错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥把uitableview视图增加到uiscrollview视图上出错相关的知识,希望对你有一定的参考价值。
参考技术A http://rralun.blog.163.com/blog/static/103904296201311123030667/最近优化工程,遇到一个很棘手的问题,就是uitableview的内容视图下移,如图所示
ios7 uitableview内容视图下移 - Ameast - Dream
我左右两个tableview设置的起始坐标是一样的,但是相对于右边tableview而言,左边的tableview的内容视图明显下移了20,后面的蓝色为设置的tableview的背景色,红色块是第一个cell,后来想的解决办法是设置contentoffset,这个方法第一次进入这个页面是可以的,但是从其它页面切换回来的时候,会出现tableview的内容视图先上移到(0,0)的位置,然后又下移到如图所示位置,于是又通过万能的google,知道了这是ios7的特性,iOS7在Conttoller中新增了这个属性:automaticallyAdjustsScrollViewInsets,当设置为YES时(默认YES),如果视图里面存在唯一一个UIScrollView或其子类View,那么它会自动设置相应的内边距,这样可以让scroll占据整个视图,又不会让导航栏遮盖,我们设置automaticallyAdjustsScrollViewInsets这个属性为no,就可以解决这个问题,当然也可以通过修改UIViewController的edgesForExtendedLayout这个属性来实现。
self.edgesForExtendedLayout = UIExtendedEdgeNone;
关于详细的介绍,可以参考http://www.vinqon.com//codeblog/?detail/11109本回答被提问者和网友采纳
为啥我的 UITableView 滚动偏移在返回其视图时最终落在 UISearchController 后面?
【中文标题】为啥我的 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视图增加到uiscrollview视图上出错的主要内容,如果未能解决你的问题,请参考以下文章
我的 UITableView 不会向下滚动到数据的末尾!为啥?
为啥我的 UITableView 滚动偏移在返回其视图时最终落在 UISearchController 后面?
为啥 UITableView 单元格 separatorInset 默认为 15,而视图控制器的根视图 Layout Margins 为 16?