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

Ios 在“cellForRowAt”中激活NSLayoutConstraint直到滚动后才会呈现,ios,swift,uitableview,uikit,nslayoutconstraint,Ios,Swift,Uitableview,Uikit,Nslayoutconstraint,我需要支持UITableViewAutomaticDimension(用于动态高度),约束条件有所不同:有些需要激活,有些不需要 我在安装了aConstraint而未安装bConstraint的情况下设置故事板。我会根据需要在表格视图(u:cellForRowAt:)中激活/停用它们 问题 初始可见布局将忽略所有这些激活/停用,并且所有单元格都与原始情节提要状态相同 您将注意到,只有在滚动之后才应用正确的约束 尝试 我确实尝试了一些cell.setNeedsUpdateConstraints()

我需要支持
UITableViewAutomaticDimension
(用于动态高度),约束条件有所不同:有些需要激活,有些不需要

我在安装了
aConstraint
而未安装
bConstraint
的情况下设置故事板。我会根据需要在
表格视图(u:cellForRowAt:)
中激活/停用它们

问题 初始可见布局将忽略所有这些激活/停用,并且所有单元格都与原始情节提要状态相同

您将注意到,只有在滚动之后才应用正确的约束

尝试 我确实尝试了一些
cell.setNeedsUpdateConstraints();cell.updateConstraintSifRequired();cell.layoutifneed()


示例项目在

上分享了在代码中设置约束的几个问题

1. UILabel intrinsicContentSize将参与自动布局。 自动布局系统将基于intrinsicContentSize创建宽度和高度约束

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

2. 如果要尝试激活或停用约束,可能需要使用简单的UIView

3.
如果您想做各种高度行,请利用intrinsicContentSize,并设置UILabel的preferredWidth。

在代码中设置约束时有几个问题

1. UILabel intrinsicContentSize将参与自动布局。 自动布局系统将基于intrinsicContentSize创建宽度和高度约束

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

2. 如果要尝试激活或停用约束,可能需要使用简单的UIView

3.
如果您想做不同高度的行,请利用intrinsicContentSize,并设置UILabel的preferredWidth。

设置同时安装了“aConstraint”和“bConstraint”的情节提要,但对“aConstraint”设置较低的优先级以删除警告,它可以工作:)

设置同时安装了“aConstraint”和“bConstraint”的情节提要,但将优先级降低到“aConstraint”以删除警告,它就可以工作:)

UILabel已在github上删除。问题的焦点是,在github上删除的ui标签之前,在
cellForRowAt
中激活未安装的约束无效。问题的焦点是,在
cellForRowAt
中激活未安装的约束在滚动完成之前无效。它在
aConstraint
bConstraint
设置为优先级999的情况下都有效。谢谢。它同时适用于优先级为999的
aConstraint
bConstraint
设置。谢谢
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
    }
}