Objective c “我该怎么做?”;禁用";不删除它们的约束?

Objective c “我该怎么做?”;禁用";不删除它们的约束?,objective-c,xcode,autolayout,Objective C,Xcode,Autolayout,我有一个在纵向模式和横向模式下工作的应用程序。当我转动我的设备时,我的一些标签和按钮没有显示出来,所以我想把它们放在旁边 有一种方法可以移除约束 [self.view removeConstraint:myConstraint]; ALTER TABLE TableName NOCHECK CONSTRAINT ConstraintName ALTER TABLE TableName CHECK CONSTRAINT ConstraintName 这种方法消除了约束,所以当我将设备返回到纵

我有一个在纵向模式和横向模式下工作的应用程序。当我转动我的设备时,我的一些标签和按钮没有显示出来,所以我想把它们放在旁边

有一种方法可以移除约束

[self.view removeConstraint:myConstraint];
ALTER TABLE TableName NOCHECK CONSTRAINT ConstraintName
ALTER TABLE TableName CHECK CONSTRAINT ConstraintName
这种方法消除了约束,所以当我将设备返回到纵向模式时,我必须用代码再次创建约束,这真是令人沮丧


是否有任何方法可以在不实际删除约束的情况下禁用约束?

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

它省去了再次创建它的麻烦

这种方法消除了约束,所以当我将设备返回到纵向模式时,我必须用代码再次创建约束,这真是令人沮丧

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

删除约束并用其他约束替换它们是标准过程,而且非常简单。在界面内外交换约束是移动对象的方式,尤其是作为响应旋转而更改界面的一种方式。这只是把你所有的鸭子排成一行的问题。将一组约束放在一个数组中;在另一个数组中放置另一组约束;当需要交换时,移除一组,然后添加另一组!尽可能简单

下面是一些实际的代码(很快,但不会有任何影响):


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

禁用所有表约束

[self.view removeConstraint:myConstraint];
ALTER TABLE TableName NOCHECK CONSTRAINT ConstraintName
ALTER TABLE TableName CHECK CONSTRAINT ConstraintName
--启用所有表约束

[self.view removeConstraint:myConstraint];
ALTER TABLE TableName NOCHECK CONSTRAINT ConstraintName
ALTER TABLE TableName CHECK CONSTRAINT ConstraintName

您是否考虑过使用对纵向和横向都有效的约束?您可以在iOS8.Matt中为其使用大小类,您是否发现新的activateConstraint和deactivateConstraint工作正常?我试着用它们来回答另一个问题,但我无法让它们工作。例如,我可以在不停用初始约束的情况下激活一组约束(来自outlet集合),并且我没有收到任何错误,即使它们是相互冲突的约束(视图显示了新激活的约束的位置)。当我旋转到横向并返回时,视图返回到原始约束。self.view.constraints日志显示了所有这些约束。对可能的最后一条评论的更正。实际上,当两组约束都处于活动状态时(在对已卸载的组调用ActivateConstraint之后),视图被放置在两组约束的混搭中。如果我取消激活原来的设置,并激活新的设置,视图就是它应该位于的位置,但在旋转后仍会恢复到最初安装的视图。@rdelmar嗯,我从works获得该代码的示例项目;如果你想试试看(当然,如果这些命令有问题,我真的很想知道!):谢谢Matt,我会试试的。