如何在不删除约束的情况下“禁用”约束?

时间:2014-12-25 14:25:31

标签: objective-c xcode autolayout

我有一个适用于纵向模式和横向模式的应用程序。当我转动我的设备时,我的一些标签和按钮没有显示,所以我希望将它们放在一边。

有一种方法可以删除约束

[self.view removeConstraint:myConstraint];

此方法删除了约束,因此当我将设备恢复为纵向模式时,我必须使用非常令人沮丧的代码再次创建约束。

有没有办法只是禁用约束而不实际删除它们?

3 个答案:

答案 0 :(得分:3)

如果您将约束作为iVar,则可以将其从视图中删除,保留对它的强引用,然后在需要时将其添加回来。

它不再需要再次创建它。

答案 1 :(得分:1)

  

此方法删除了约束,因此当我将设备恢复为纵向模式时,我必须使用非常令人沮丧的代码再次创建约束。

停下来问自己为什么“真的很沮丧”。不应该!如果是的话,你做错了。

删除约束并将其替换为其他约束是标准过程,并且非常简单。在界面内外交换约束是你如何移动,特别是作为一种改变界面以响应旋转的方式。这只是让你的所有鸭子连续排起来的问题。将一组约束放在一个数组中;在另一个数组中放入另一组约束;当交换时,删除一组并添加另一组!很简单。

这是一些实际的代码(它是Swift,但不会对任何影响):

func doSwap(landscape:Bool) {
    if landscape {
        NSLayoutConstraint.deactivateConstraints(self.constraintsWith)
        NSLayoutConstraint.activateConstraints(self.constraintsWithout)
    } else {
        NSLayoutConstraint.deactivateConstraints(self.constraintsWithout)
        NSLayoutConstraint.activateConstraints(self.constraintsWith)
    }
}

请注意使用新版iOS-8 NSLayoutConstraint.deactivateConstraintsNSLayoutConstraint.activateConstraints。这是一个真正的节省工作,因为您不需要将约束附加到任何特定视图;它会自动完成。

答案 2 :(得分:-3)

禁用所有表约束

ALTER TABLE TableName NOCHECK CONSTRAINT ConstraintName

- 启用所有表约束

ALTER TABLE TableName CHECK CONSTRAINT ConstraintName