【问题标题】:How do I "disable" constraints without removing them?如何在不删除约束的情况下“禁用”约束?
【发布时间】:2014-12-25 14:25:30
【问题描述】:

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

有一种方法可以消除约束

[self.view removeConstraint:myConstraint];

这种方法消除了约束,所以当我将设备转回纵向模式时,我不得不用代码再次创建约束,这真的很令人沮丧。

有什么方法可以禁用约束而不实际删除它们?

【问题讨论】:

  • 您是否考虑过使用对纵向和横向都有效的约束?你可以在 iOS8 中使用 size classes。

标签: objective-c xcode autolayout


【解决方案1】:

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

它省去了重新创建它的麻烦。

【讨论】:

    【解决方案2】:

    这种方法消除了约束,所以当我将设备转回纵向模式时,我不得不用代码再次创建约束,这真的很令人沮丧。

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

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

    这是一些实际的代码(它是 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。这是一个真正的工作节省,因为您不需要将约束附加到任何特定视图;它会自动为您完成。

    【讨论】:

    • Matt,你有没有发现新的 activateConstraints 和 deactivateConstraints 工作正常?我尝试用它们来回答另一个问题,但我无法让它们工作。例如,我可以激活一组约束(来自插座集合)而不停用初始约束,并且我没有收到任何错误,即使它们是冲突的约束(视图显示在新激活约束的应有位置)。当我旋转到横向并返回时,视图又回到了原来的约束。 self.view.constraints 的日志显示了所有这些。
    • 更正可能最后的评论。实际上,在两组约束都处于活动状态(在卸载组上调用 activateConstraints 之后)的情况下,视图被放置在看起来像是两组的混搭中。如果我停用原始设置并激活新设置,则视图将位于应有的位置,但旋转后仍会恢复为最初安装的视图。
    • @rdelmar 好吧,我从作品中获得该代码的示例项目;如果您想尝试一下(当然,如果这些命令存在有问题,我真的很想知道它!):github.com/mattneub/Programming-iOS-Book-Examples/tree/…
    • 谢谢马特,我试试看。
    【解决方案3】:

    禁用所有表约束

    ALTER TABLE TableName NOCHECK CONSTRAINT ConstraintName
    

    -- 启用所有表约束

    ALTER TABLE TableName CHECK CONSTRAINT ConstraintName
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-22
      • 2011-04-26
      • 2023-03-10
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      相关资源
      最近更新 更多