如果禁用滚动,您能否根据显示的行数更新 UITableView 的内在内容大小?

Mar*_*eIV 3 uitableview autolayout swift ios8

我们有一部分 UI,它是一个小的标签列表,旁边有色板。我接手的设计在布局中硬编码了其中的六个,即使实际数据是动态的,这意味着如果我们只需要显示三个,我们必须明确隐藏三个,这也会破坏页面的平衡. 更糟糕的是,这些“项目”中的每一个实际上都由几个子视图组成,因此具有六个硬编码项目的屏幕有 18 个 IBOutlets。

我想要做的是使用 aUITableView来表示屏幕的这一小部分,并且由于它不会滚动,我想知道您是否可以使用 AutoLayout 来配置UITableView要基于行数。

目前我有一个UITableView垂直约束到中心的测试页,但没有高度约束,因为我希望表格的内在内容大小反映可见行。我还禁用了在桌子上滚动。当我重新加载表时,我调用 updateConstraints。但是表格仍然没有调整大小。

注意:我们不能使用 UIStackView(这本来是完美的),因为我们必须针对 iOS8 而这直到 iOS9 才被引入,因此这个解决方案。

有没有人能够做一些与我们的需求类似的事情?

Mar*_*eIV 6

好的,与 不同UITextView,它看起来UITableView从未根据可见行返回固有大小。但是通过子类实现这并不是什么大问题,特别是如果只有一个部分,没有页眉或页脚,并且行的高度是固定的。

class AutoSizingUiTableView : UITableView
{
    override func intrinsicContentSize() -> CGSize
    {
        let requiredHeight = rowCount * rowHeight
        return CGSize(width: UIView.noIntrinsicMetric, height: CGFloat(requiredHeight))
    }
}
Run Code Online (Sandbox Code Playgroud)

我会把它留给读者来弄清楚如何获得他们自己的rowCount. 如果您有可变的高度、多个部分等,也是如此。您只需要更多的逻辑。

通过这样做,它可以很好地与 AutoLayout 配合使用。我只是希望它自动处理这个。


no_*_*ord 5

// 定义这只小狗:

class AutoTableView: UITableView {   
 
    override func layoutSubviews() {
        super.layoutSubviews()
        self.invalidateIntrinsicContentSize()
    }
    
    override var intrinsicContentSize: CGSize {
        get {
            var height:CGFloat = 0;
            for s in 0..<self.numberOfSections {
                let nRowsSection = self.numberOfRows(inSection: s)
                for r in 0..<nRowsSection {
                    height += self.rectForRow(at: IndexPath(row: r, section: s)).size.height;
                }
            }
            return CGSize(width: UIView.noIntrinsicMetric, height: height)
        }
        set {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并使其成为您的 IB 课程。obs:如果你的班级只是细胞和狗屎。如果它有页眉、页脚或其他一些东西,不知道。它不会工作。为了我的目的,它有效

和平

  • 我喜欢这个!这非常有帮助。我必须做的唯一更改是添加页眉/页脚视图的高度,因此我的版本不是以 `var height:CGFloat = 0;` 开头,而是以 `var height: CGFloat = (self.tableHeaderView?.frame.height ?? 0) + (self.tableFooterView?.frame.height ?? 0)`。 (3认同)