在故事板中使用自动布局时,有一个“已安装”复选框选项,用于保留或取消保留约束。禁用它将使约束行为就像您没有添加该约束一样 - 它不会产生任何影响。您可以在界面构建器中为不同的大小类配置已安装状态,并且您可以通过将其active
属性设置为true
或false
来编程更改此值。
在我的应用程序中,我希望仅在设备处于纵向时安装约束-在旋转到横向时应将其“卸载”。这可以通过为iPhone取消勾选任何宽度紧凑高度的已安装来实现。(尽管当旋转到横向时不应该安装它时,似乎不起作用,因为会破坏此约束,但无论如何,UI始终显示为预期的样子。)但是,在界面构建器中,无法卸载iPad在横向上的约束(在两个方向上都是普通宽度普通高度)。
在旋转设备时启用/禁用NSLayoutConstraint
的active
的正确位置在哪里?更改该状态会以所需的方式产生哪种行为?如果该方法在应用程序启动时未调用,则应将其放置在哪个其他方法中以及旋转方法?
我尝试将以下代码放置在viewDidLoad
和viewWillTransitionToSize
中,但在iPad上运行时会导致一些意外的行为:
- 在横向启动应用程序会导致约束处于活动状态,尽管已将其设置为false,它会破坏约束,并且UI不会按预期显示
- 在纵向中启动应用程序会将active设置为true(它已安装在IB中),因此可以按预期工作
- 在纵向中启动应用程序并旋转到横向会像预期那样工作-约束被设置为非活动状态,它不会破坏约束,UI按预期显示
- 在纵向中启动应用程序后,将其旋转到横向并返回到纵向会使UI显示正确,但会破坏此已设置为活动状态的约束
如果我在界面构建器中卸载约束,然后运行上述场景,我会获得基本相反的行为。
if size.width > size.height {
self.myConstraint.active = false
} else {
self.myConstraint.active = true
}