【问题标题】:Make UITableView not scrollable and adjust height to accommodate all cells使 UITableView 不可滚动并调整高度以适应所有单元格
【发布时间】:2014-06-06 20:26:06
【问题描述】:

我将UITableView 嵌入到另一个UIScrollView 中。我只希望UIScrollView 滚动,而不是UITableView,所以我想禁用UITableView 中的滚动,并为UITableView 扩展contentHeight 以同时容纳所有动态。

我该怎么做呢?

【问题讨论】:

  • 为什么需要这个功能?您想在滚动视图中添加更多子视图吗?
  • 我想添加一个基本上想在同一页面中集成子视图作为tableview,而不是将整个视图作为tableview。
  • 因此您必须扩展您的表格视图以适应该表格的长度。然后调整滚动视图的内容大小
  • 调用reloadData后,如果你实现estimatedHeight,表格视图应该有正确的contentSize。
  • 如果其他子视图在tableview的顶部,也可以在tableview中添加这些子视图:以sections分隔。第 0 部分包含您的 subview1,第 1 部分包含您的 subview2,第 2 部分包含您所讨论的 tableview 的内容。

标签: ios uitableview


【解决方案1】:

将 tableView 滚动属性设置为 false。

第一种方法:

  1. 为tableView 创建一个子类并覆盖intrinsicContentSize。

         class MyOwnTableView: UITableView {
        override var intrinsicContentSize: CGSize {
            self.layoutIfNeeded()
            return self.contentSize
        }
    
        override var contentSize: CGSize {
            didSet{
                self.invalidateIntrinsicContentSize()
            }
        }
    
        override func reloadData() {
            super.reloadData()
            self.invalidateIntrinsicContentSize()
        }
    }
    
  2. 在 Interface builder 中,将 tableView 的类更改为 MyOwnTableView(子类 UITableView)。

  3. 为表格视图设置自动行高。

        tableView.estimatedRowHeight = 60.0;
        tableView.rowHeight = UITableViewAutomaticDimension;
    

第二种方法: 1.为tableView创建一个任意值的高度约束,并连接一个设置tableView高度的IBOutlet。

  1. 重新加载数据后设置高度约束的常量为tableView.contentSize.height。

    self.tableViewHeight.constant = self.tableView.contentSize.height
    

【讨论】:

  • 优秀的答案,我见过很多只适用于 viewControllers 中的 tableViews 的,还有只是简单的错误答案,根本没有任何解释!
  • @JamesWolfe 谢谢! :)
  • 第一种方法不起作用。第二种方法效果很好。
  • 您的第二种方法非常适合用于自动布局,谢谢!
  • 这适用于我的用例。我在滚动视图内部的堆栈视图中有一个表格视图。我需要表格来展开并显示其所有内容,并且我需要一个表格,因为我仍然想要滑动操作等
【解决方案2】:

设置tableView的大小等于contentSize。

override func viewDidLayoutSubviews() {
    tableView.frame.size = tableView.contentSize
}

【讨论】:

  • 但这不会增加滚动视图的内容大小。内容大小保持不变。
  • 而且内容不见了
【解决方案3】:

您需要将UITableView 滚动设置为false

tableview.scrollEnabled = false;

tableview.frame = CGRectMake(tableview.frame.origin.x, tableview.frame.origin.y, tableview.frame.size.width, tableview.frame.size.height+(resultArray.count*HEIGHT_OF_CELL));

然后您可以将UITableView 添加到UIScrollView,方法是将其内容大小设置为UITableView 高度。

【讨论】:

  • 单元格的动态高度怎么样?
  • 对于单元格的动态高度,您可以在 HeightForRowAtIndexPath 方法中计算总高度,然后相应地设置滚动视图框架。
  • 好的,但是延迟加载单元格呢?如果您有 20 个单元格,它们会同时加载,而不是在滚动时通过延迟加载。它们没有被重复使用……有什么帮助吗?
【解决方案4】:

基本上,tableview 的内容大小就是你所需要的。

  1. 将 tableview 滚动设置为 false,因为我们不想要 scolling 行为。

  2. 获取tableview高度约束的引用。

  3. 设置tableViewHeightConstraint.constant = tableView.contentSize.height

确保 tableview 的顶部、底部、前导和尾随约束并且就位。

【讨论】:

  • 由于未知原因,tableView.contentSize.height 总是返回 0。
  • 确保 tableview 约束正确到位
【解决方案5】:
  1. 让您的表格视图框架覆盖所有可能的行 -> 表格视图不滚动
  2. 设置滚动视图的 contentSize = 表格视图的大小。

【讨论】:

  • 还需要设置 tableview.bounces = NO 以确保它不会窃取滚动焦点。
【解决方案6】:
  • 首先你需要设置UITableView滚动到NO
  • 其次,为表格视图创建一个height constraint,并在调用[UITableView reloadData] 后更改您的height constraint

    tableViewHeightConstraint.constant = numberOfRows * heightOfEachRow;
    

【讨论】:

    【解决方案7】:

    您还可以使用 Combine 通过 KVO 观察 tableView 的 contentSize

    想法:您更新 tableView 的高度约束,只要它的 contentSize 发生变化。

    我尝试使用此线程中的一些解决方案来实现它,但由于时间问题,有时会以错误的contentSize 值结束。使用 KVO 可确保捕获 contentSize 上的所有更新。

    1. 在 tableView 上定义高度约束
    2. 确保在 tableView 上禁用滚动
    3. 订阅 KVO 发布者上的更改,以便在 viewDidLoad 中为 tableView 的 contentSize
    4. 将高度约束常量的值分配给您收到的值

    KVO 部分的代码示例:

    class YourViewController: UIViewController {
        private var tokens: Set<AnyCancellable> = []
    
        func viewDidLoad() {
            super.viewDidLoad()
    
            tableView.publisher(for: \.contentSize).sink { [weak self] contentSize in
                self?.tableViewHeightConstraint.constant = contentSize.height
            }.store(in: &tokens)
        }
    }
    

    【讨论】:

      【解决方案8】:

      UITableView 是一个滚动视图。虽然您不应该嵌套 UIScrollviews,但您可以禁用表格视图的滚动。

      【讨论】:

      • 我明白这一点,但我需要调整 tableview 高度以适应所有单元格。例如,如果我有 5 个单元格,禁用 uitableview 滚动只会隐藏最后 2 个单元格。
      • 您可以在 UITableView 数据源回调上分配 UITableViewCell 高度时执行此操作。因此,给定数据源数组中的许多元素,分配一个足以容纳所有元素的高度。
      【解决方案9】:

      虽然使用固定内容的表格视图作为滚动视图中的子视图来实现这一点非常简单,但您到底想要实现什么?上下固定内容的动态单元格?永久显示的内容,中间有一个滑动部分?

      也许更简洁的设计是使用带有表头和页脚的单个 UITableView,或者利用 UITableViewStyleGrouped 与 UITableViewStylePlain 提供的自动行为的节头和页脚

      也就是说,其他答案似乎形成了一个不错的解决方案:

      Set scroll enabled false on table view
      Set tableview content size to sum of all cell sizes
      Set tableview frame to content size
      Adjust scroll view frame to account for dynamic table size if necessary
      Add table view to scroll view amidst other content
      

      控制滚动行为的另一个选项是在委托 scrollView shouldStartScrolling 或类似方法中检查 tableview 或 scrollview,因为这将允许 UI 控件具有更大的灵活性

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-15
        • 1970-01-01
        • 2016-05-20
        • 2014-02-16
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多