【发布时间】:2023-03-08 08:27:01
【问题描述】:
在情节提要中使用自动布局时,可以使用“已安装”复选框来选择是否安装约束。禁用它会导致它的行为就像您没有添加该约束一样 - 它不会产生任何影响。您可以在 Interface Builder 中为不同大小的类配置已安装状态,您可以通过将其 active 属性设置为 true 或 false 以编程方式更改此值。
在我的应用程序中,我希望仅在设备处于纵向时安装约束 - 旋转到横向时应该“卸载”。这可以通过取消选中已安装的任何宽度紧凑高度来为 iPhone 完成。 (尽管这似乎不太正确,因为它在旋转到横向时甚至不应该安装时由于冲突的约束而打破了这个约束,但不管 UI 总是按预期显示。)但是没有办法卸载Interface Builder 中 iPad 的横向约束(两个方向的常规宽度常规高度)。
在旋转设备时启用/禁用 active 和 NSLayoutConstraints 的正确位置在哪里? 以何种旋转方法更改该状态会导致所需的行为 - 仅安装用于肖像?如果在应用启动时没有调用该方法,除了轮换方法之外,还应该将它放在什么其他方法中?
我已尝试将以下代码放在 viewDidLoad 和 viewWillTransitionToSize 中,但这会导致在 iPad 上运行时出现一些意外行为:
- 在横向启动应用程序会导致约束处于活动状态,尽管 active 设置为 false,它会破坏约束,并且 UI 不会按预期显示
- 纵向启动应用程序将 active 设置为 true(它已安装在 IB 中),因此它可以按预期工作
- 纵向启动应用程序并将设备旋转到横向按预期工作 - 约束设置为非活动,它不会破坏约束,UI 显示如预期
- 以纵向启动应用程序、旋转到横向并返回到纵向会导致 UI 显示正确,但它会打破设置为活动的限制
如果我在 Interface Builder 中卸载约束,然后运行上述场景,我会得到基本上相反的行为。
if size.width > size.height {
self.myConstraint.active = false
} else {
self.myConstraint.active = true
}
【问题讨论】:
标签: ios ios8 screen-rotation autolayout