【问题标题】:Activating/Deactivating Constraints on orientationchange在orientationchange上激活/停用约束
【发布时间】:2016-02-09 18:43:16
【问题描述】:

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

测试设备:
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 或类似的东西有更高的分辨率。

谢谢:)

【问题讨论】:

    标签: ios xcode swift


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 两种方法都试过了,先激活先停用,都一样...我会优先尝试,好主意... PS 将所有设置为999就足够了吗?激活一组应该什么都不做,因为它们都是可选的,当我停用另一组时......会尝试一下,没有时间 atm :/
    • @Inuyaki 它不起作用有点令人惊讶。错误消息(无法同时满足约束)究竟是什么时候出现的?在启动时或旋转设备时?究竟是在哪个 Swift 语句之后?
    • 如帖子中所写,仅在旋转时且仅在 iPhone 上且仅在一个方向上...我确实将所有内容设置为 999,不再出现错误,但发生了其他事情。我想我可以从这里解决它,也许只是在激活/停用之前将两组设置为 999,然后再设置为 1000 左右......我会看到:)
    • @Inuyaki 好的。但是一旦将优先级设置为 1000,就无法再更改它。这就是它的工作原理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2018-12-17
    • 2015-02-14
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    相关资源
    最近更新 更多