Mar*_*eIV 3 uitableview autolayout swift ios8
我们有一部分 UI,它是一个小的标签列表,旁边有色板。我接手的设计在布局中硬编码了其中的六个,即使实际数据是动态的,这意味着如果我们只需要显示三个,我们必须明确隐藏三个,这也会破坏页面的平衡. 更糟糕的是,这些“项目”中的每一个实际上都由几个子视图组成,因此具有六个硬编码项目的屏幕有 18 个 IBOutlets。
我想要做的是使用 aUITableView来表示屏幕的这一小部分,并且由于它不会滚动,我想知道您是否可以使用 AutoLayout 来配置UITableView要基于行数。
目前我有一个UITableView垂直约束到中心的测试页,但没有高度约束,因为我希望表格的内在内容大小反映可见行。我还禁用了在桌子上滚动。当我重新加载表时,我调用 updateConstraints。但是表格仍然没有调整大小。
注意:我们不能使用 UIStackView(这本来是完美的),因为我们必须针对 iOS8 而这直到 iOS9 才被引入,因此这个解决方案。
有没有人能够做一些与我们的需求类似的事情?
好的,与 不同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 配合使用。我只是希望它自动处理这个。
// 定义这只小狗:
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:如果你的班级只是细胞和狗屎。如果它有页眉、页脚或其他一些东西,不知道。它不会工作。为了我的目的,它有效
和平
| 归档时间: |
|
| 查看次数: |
6404 次 |
| 最近记录: |