为啥把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 不会向下滚动到数据的末尾!为啥?

为啥我的 UITableView 滚动偏移在返回其视图时最终落在 UISearchController 后面?

为啥 UITableView 单元格 separatorInset 默认为 15,而视图控制器的根视图 Layout Margins 为 16?

为啥我的 UITableView 在 iOS 7 中被切断了?

当我从单独的视图控制器中删除核心数据实体时,为啥会调用 UITableView 方法?