我需要支持UITableViewAutomaticDimension
(动态高度)以及约束的变化:有些需要处于活动状态,有些则不需要。
我设置了故事板,安装了aConstraint
而不是,并安装了bConstraint
。我在tableView(_:cellForRowAt:)
中根据需要激活/停用它们。
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView! {
didSet {
tableView.estimatedRowHeight = 10
tableView.rowHeight = UITableViewAutomaticDimension
}
}
}
class MyTableViewCell: UITableViewCell {
@IBOutlet var aConstraint: NSLayoutConstraint!
@IBOutlet var bConstraint: NSLayoutConstraint!
}
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 20
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MyTableViewCell", for: indexPath) as! MyTableViewCell
cell.contentView.translatesAutoresizingMaskIntoConstraints = false
if indexPath.row % 2 == 0 {
NSLayoutConstraint.deactivate([cell.aConstraint])
NSLayoutConstraint.activate([cell.bConstraint])
} else {
NSLayoutConstraint.deactivate([cell.bConstraint])
NSLayoutConstraint.activate([cell.aConstraint])
}
return cell
}
}
初始可见布局忽略所有这些激活/停用,并且所有单元格都与原始故事板状态相同。
您会注意到正确的约束仅在滚动后应用。
我确实尝试了一些cell.setNeedsUpdateConstraints(); cell.updateConstraintsIfNeeded(); cell.layoutIfNeeded(); ...
答案 0 :(得分:4)
使用' aConstraint'设置故事板和' bConstraint'安装,但优先考虑' aConstraint'删除警告,它的工作原理:)
答案 1 :(得分:0)
在代码中设置约束时遇到一些问题。
UILabel intrinsicContentSize将参与自动布局。 自动布局系统将根据intrinsicContentSize创建宽度和高度约束。
您在xib文件中明确设置标签的高度约束,导致歧义,然后添加垂直中心Y约束来解决问题。
如果您想尝试激活或取消激活约束,您可能希望使用简单的UIView来实现。
如果要进行各种高度行,请利用intrinsicContentSize,并设置UILabel的preferredWidth。