Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在两个自动布局约束之间切换?_Ios_Autolayout - Fatal编程技术网

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

Ios 如何在两个自动布局约束之间切换?,ios,autolayout,Ios,Autolayout,我有两个UI布局约束,它们在设计上相互冲突。一次只能激活其中一个 在UIViewController的方法updateConstraintsIfNeeded中,我有以下代码,根据数据模型的状态在两个约束之间切换 override func updateConstraintsIfNeeded() { super.updateConstraintsIfNeeded() if question?.thumbURL != nil { showAttachmentCons

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

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
约束,这正是问题中描述的问题。