在“cellForRowAt”中激活NSLayoutConstraint直到滚动后才会呈现

时间:2017-04-05 07:56:45

标签: ios swift uitableview uikit nslayoutconstraint

我需要支持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(); ...

https://github.com/Coeur/dynamic-cell-height

上共享的示例项目

2 个答案:

答案 0 :(得分:4)

使用' aConstraint'设置故事板和' bConstraint'安装,但优先考虑' aConstraint'删除警告,它的工作原理:)

答案 1 :(得分:0)

在代码中设置约束时遇到一些问题。

1。

UILabel intrinsicContentSize将参与自动布局。    自动布局系统将根据intrinsicContentSize创建宽度和高度约束。

您在xib文件中明确设置标签的高度约束,导致歧义,然后添加垂直中心Y约束来解决问题。

2

如果您想尝试激活或取消激活约束,您可能希望使用简单的UIView来实现。

3

如果要进行各种高度行,请利用intrinsicContentSize,并设置UILabel的preferredWidth。