如何在两个自动布局约束之间切换?

时间:2015-11-23 09:44:45

标签: ios autolayout

我有两个UI布局约束,它们在设计上相互冲突。一次只能有一个活跃。

UIViewController's方法updateConstraintsIfNeeded中,我有以下代码在两个约束之间切换,具体取决于数据模型的状态。

override func updateConstraintsIfNeeded() {
    super.updateConstraintsIfNeeded()

    if question?.thumbURL != nil {
        showAttachmentConstraint.active = true
        hideAttachmentConstraint.active = false        
    } else {
        showAttachmentConstraint.active = false
        hideAttachmentConstraint.active = true
    }
}

这项工作按预期进行,但我在调试输出中得到了这个熟悉的警告:

  

无法同时满足约束条件。可能至少下列列表中的一个约束是您不想要的约束。 ...

显然,当执行语句showAttachmentConstraint.active = true时,它暂时与当时仍处于活动状态的hideAttachmentConstraint冲突。

是否可以将此切换操作设为原子?我希望beginUpdate中有endUpdateUITableView之类的内容。

2 个答案:

答案 0 :(得分:5)

您可以将其中一个冲突约束的优先级更改为999而不是1000.因此您在设计时甚至没有任何问题。

答案 1 :(得分:1)

始终首先停用某些约束,然后激活其他约束:

override func updateConstraintsIfNeeded() {
    super.updateConstraintsIfNeeded()

    if question?.thumbURL != nil {
        hideAttachmentConstraint.active = false
        showAttachmentConstraint.active = true
    } else {
        showAttachmentConstraint.active = false
        hideAttachmentConstraint.active = true
    }
}