在orientationchange

时间:2016-02-09 10:04:13

标签: ios xcode swift

我不能让它上班,我不知道为什么......其他问题+答案很遗憾没有帮助。

经测试的设备:
iPhone 6
iPad 2

相关代码:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator){
    updateConstraints()
}
override func viewWillLayoutSubview() {
    updateConstraints()
}

func updateConstraints() {
    if UIDevice.currentDevice().orientation.isLandscape {
        NSLayoutConstraint.activateConstraints(layoutLandscape!)
        NSLayoutConstraint.deactivateConstraints(layoutPortrait!)
    }
    else {
        NSLayoutConstraint.activateConstraints(layoutPortrait!)
        NSLayoutConstraint.deactivateConstraints(layoutLandscape!)
    }
    view.layoutIfNeeded()
}

layoutLandscape和layoutPortrait是约束数组。

这确实有效:
- iPad加载视图,肖像和风景
- iPad旋转视图,纵向和横向
- iPhone加载视图,肖像和风景
- iPhone旋转视图,仅横向 - >肖像

不起作用:
- iPhone肖像 - >风景

当我在故事板中默认激活肖像时,iPhone旋转以这种方式工作。如果我将其更改为横向约束,则纵向 - >景观作品,另一个没有。

错误信息(这也没有真正帮助......)只是我打破了一些限制(这些限制很多,所以太难以缩小范围),但后来我想知道为什么它确实有效在iPhone上以两个方向加载视图 为什么它完全在iPad上运行?它并不像iPhone那样具有比iPhone或类似物更高的分辨率。

谢谢:)

1 个答案:

答案 0 :(得分:3)

激活布局约束时,会立即检查它们是否与其他约束冲突。如果是这样,有些会被破坏,即被删除。

在您的代码中,这可能会发生,因为您首先激活约束,此时您有太多的冲突约束。

所以第一种方法是首先停用不再相关的那些,然后激活新的(而不是反过来)。

另一种被认为更有效的方法是不激活和停用约束,而是将当前相关的优先级设置为999,将不相关的优先级设置为1。 (注意:它是999而不是1000。)