UITableView dequeueReusableCell复制约束

时间:2019-06-29 22:26:45

标签: ios swift uitableview nslayoutconstraint

我很快就使用了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())
    ])
}

感谢您的帮助。

1 个答案:

答案 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()
}