Ios 如何在两个自动布局约束之间切换?
我有两个UI布局约束,它们在设计上相互冲突。一次只能激活其中一个 在Ios 如何在两个自动布局约束之间切换?,ios,autolayout,Ios,Autolayout,我有两个UI布局约束,它们在设计上相互冲突。一次只能激活其中一个 在UIViewController的方法updateConstraintsIfNeeded中,我有以下代码,根据数据模型的状态在两个约束之间切换 override func updateConstraintsIfNeeded() { super.updateConstraintsIfNeeded() if question?.thumbURL != nil { showAttachmentCons
UIViewController的方法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
冲突
是否可以使此切换操作原子化?我希望在UITableView
中有类似beginUpdate
和endUpdate
的内容,您可以将其中一个冲突约束的优先级更改为999,而不是1000。因此,您在设计时甚至没有任何问题。始终先停用一些约束,然后激活其他约束:
override func updateConstraintsIfNeeded() {
super.updateConstraintsIfNeeded()
if question?.thumbURL != nil {
hideAttachmentConstraint.active = false
showAttachmentConstraint.active = true
} else {
showAttachmentConstraint.active = false
hideAttachmentConstraint.active = true
}
}
您确定需要两个约束条件吗?你能不能不只是拥有一个,而是在代码中操作它?无论如何,尝试反转第一个if分支中的操作顺序,这样您可以先禁用不必要的约束,然后启用所需的约束。在这两条语句之间,没有同时处于活动状态的约束。请尝试将其放在UIView动画块中。;)看看这个@Morpheu5好问题。因此,我最终采用了单约束方法,并按照您的建议操纵常量。你关于安排约束激活/停用顺序的建议很聪明,尽管我还没有确认是否有效。无论如何谢谢你!改变优先次序真的应该是万不得已的事情。最好尽可能少地使用约束,并对其进行操作。这样就更容易对它们进行推理。你不应该滥用它。但我认为在这种情况下使用它没有问题。正如官方文件所述:[…]这种不平等、平等和优先权的组合为您提供了极大的灵活性和力量。通过组合多个约束,您可以定义随着用户界面中元素的大小和位置的变化而动态调整的布局。[…]
这确实是一个足够简单的情况,可能不会引起任何问题。我只是说,在更复杂的情况下,在修改优先级之前,您可能想先看看其他更清晰的替代方案。它们不太明显,因此,如果没有适当的文档记录,它们很容易被忽略和遗忘。如果这些约束存储在UIViewController
中呢?@VyachaslavGerchicov,会怎么样?应该是一样的,现在我明白了。在每次约束更改后,应用程序似乎都会尝试检查约束,但无论如何,最终结果都是可以的。这可以从7行代码减少到2行代码(没有显式的if语句)hideAttachment…active=question.thumbURL==nil
和showAttachment…active=question.thumbURL!=nil
@Sti,如果执行此操作,如果question.thumbURL
为nil
,将首先激活hideAttachment
约束,这正是问题中描述的问题。