【发布时间】:2025-11-27 05:50:02
【问题描述】:
我正在开发简单的应用程序,现在我专注于在用户点击该单元格后扩展 UITableViewCell。这是 iOS 8 应用,所以我设置了:
self.tableVIew.rowHeight = UITableViewAutomaticDimension
self.tableVIew.estimatedRowHeight = 50
单元格约束如下所示:
如果用户点击单元格,则调用此函数:
func extend() {
self.contentView.removeConstraint(self.bottomConstraint)
let additionalView = UIView()
additionalView.setTranslatesAutoresizingMaskIntoConstraints(false)
additionalView.backgroundColor = UIColor.orangeColor()
self.contentView.addSubview(additionalView)
self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[additionalView(50)]-5-|", options: nil, metrics: nil, views: ["additionalView" : additionalView]))
self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-5-[additionalView(100)]-5@999-|", options: nil, metrics: nil, views: ["additionalView" : additionalView]))
}
self.bottomConstraint 是绿色圆圈底部和单元格内容视图底部之间的约束。
问题是: 为什么此解决方案仅在在约束中设置了优先级时才有效:
V:|-5-[additionalView(100)]-5@999-|
?
没有明确的优先级我得到了错误:
(
"<NSLayoutConstraint:0x7a63f7a0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7a737840(60)]>",
"<NSLayoutConstraint:0x7a644f40 V:|-(5)-[UIView:0x7a63f2a0] (Names: '|':UITableViewCellContentView:0x7a737840 )>",
"<NSLayoutConstraint:0x7a644fb0 V:[UIView:0x7a63f2a0(100)]>",
"<NSLayoutConstraint:0x7a644f70 V:[UIView:0x7a63f2a0]-(5)-| (Names: '|':UITableViewCellContentView:0x7a737840 )>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7a644f70 V:[UIView:0x7a63f2a0]-(5)-| (Names: '|':UITableViewCellContentView:0x7a737840 )>
【问题讨论】:
-
我的猜测是您当前的单元格高度为 60,新高度为 110,因此需要打破其中一个约束使其增长,默认优先级为 1000,3 个同等优先级约束需要一个被打破。
-
不应该根据内容视图约束动态计算单元格的高度?
-
是的,但是 AdditionalView 的高度是 100,不是吗?
-
是的。也许我没有以正确的方式得到它,但是如果我将高度为 100 且具有约束的视图添加到超级视图,则单元格应该重新计算它的高度,并且没有理由不满足任何约束。
-
是的,应该的,你可以使用 layoutIfNeeded 来测试更多。
标签: ios uitableview autolayout