我很快就使用了UITableView
和自定义UITableViewCells
。初始化每个单元格后,我调用一个方法(layoutViews()
)以应用适当的约束(NSLayoutConstraint.activate([...]
)。一个约束条件,即标签前导锚,基于行是动态的,并导致父记录和子记录之间有些缩进。
示例:
Parent
Child
Parent
Parent
Child
Grandchild
Child
Child
滚动时,约束变得混乱,并导致同一单元格上出现重复约束
错误:无法同时满足约束条件...将尝试通过打破约束条件进行恢复)。
在大多数情况下,应该执行缩进。
我试图停用先前的约束,删除先前的约束,并从超级视图中删除所有视图。我得到了各种各样的结果,但是没有一个是正确的。
我只希望缩进匹配我在CGFloat
函数中提供的getIndentaion()
值。
根据要求,这里是相关代码(当然是缩写形式)。
在UIViewController中:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
cell.setIndentation(2)
cell.layoutViews()
return cell
}
在CustomCell中:
func getIndentation() -> CGFloat {
return 5 + ((indentation ?? 0) * 15)
}
func layoutViews() {
NSLayoutConstraint.activate([
messageLabel.leadingAnchor.constraint(equalTo: messageBackground.leadingAnchor, constant: getIndentation())
])
}
感谢您的帮助。
答案 0 :(得分:0)
谢谢你,@ Paulw11。以下解决方案有效:
在UIViewController中:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
cell.setIndentation(2)
return cell
}
在CustomCell中:
var indentationConstraint: NSLayoutConstraint!
func layoutViews() {
indentationConstraint = messageLabel.leadingAnchor.constraint(equalTo: messageBackground.leadingAnchor, constant: 5)
NSLayoutConstraint.activate([
indentationConstraint
])
}
}
func setIndentation(_ indentation: CGFloat) {
let totalIndentation: CGFloat = 5 + (indentation * 15)
indentationConstraint.constant = totalIndentation
messageLabel.layoutIfNeeded()
}