【问题标题】:UITableView height same as content sizeUITableView 高度与内容大小相同
【发布时间】:2017-04-29 04:44:33
【问题描述】:

如何让 UITableView 的高度等于其内容的高度? (即内容大小)

到目前为止,我的解决方案是在我知道高度发生变化时为表格高度和setNeedsUpdateConstraints() 创建一个约束。而且,我不能将此约束设置为 contentSize,而是需要手动计算高度,并加上单元格的高度。

这使得处理起来非常麻烦,尤其是当我在另一个表中有一个表时,或者当我不知道内容大小会改变时。

对我来说这似乎是一个正常的用例,有一个包含其内容高度的表格,我想知道我是否遗漏了一些明显的东西?

【问题讨论】:

  • UIStackView 听起来像是解决此问题的更好解决方案。当您不想使用内置的UIScrollView 时,为什么要使用UITableView
  • 感谢您的建议。但是,如果我想在另一个上下文中使用带有滚动条的同一个对象怎么办?此外,从概念上讲,我需要一个表格,因为它有单元格。 UIStackView 看起来像是一堆视图。
  • 如果表格的高度与其 contentSize.height 的高度相同,则不会滚动.. 表示不重复使用单元格。因此,您将需要一些 contentSize 的最大值,超过该最大值,您将允许表格的高度 > table.contentSize 高度。如果这是您正在寻找的东西,那么最好的方法可能是让 tableView 的 ContentSize 有一个观察者。每当它发生变化时,请检查并更改桌子的高度(如果需要)。
  • @dRAGONAIR 你如何添加那个观察者?
  • Martin 只需创建UIView,将单元格中的所有内容放在那里,然后在UITableViewCell 中重复使用或直接在任何其他UIViewController 中使用。跟踪UITableVIew 的高度变化在代码质量和应用程序性能方面是非常糟糕的做法。

标签: ios uitableview


【解决方案1】:

在 viewDidLoad 中添加观察者

tableView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)

然后执行下面的

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if let tableView = object as? UITableView {
        if tableView == self.tableView && keyPath == "contentSize" {
            // Now you know that the content size for self.tableView changed.
            // Do your frame updation here
        }
    }
}

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2021-08-28
    • 2018-12-07
    相关资源
    最近更新 更多