【问题标题】:Size Class'd Auto Layout: Constraint Activated For Wrong Size Class尺寸分类的自动布局:为错误的尺寸分类激活了约束
【发布时间】:2018-04-21 06:04:25
【问题描述】:

当我设置由 Size Classes 自定义的 Auto Layout 约束时,例如约束安装在某些 Size Class(es) 中,而不是安装在其他 Size Class 中时,我在运行时收到此 Unsatisfiable Constraints 错误消息,但结果符合预期在没有错误/警告的界面生成器上。

我在测试什么

对于这个简化的示例,为了演示 Unsatisfiable Constraints 是如何意外发生的,我希望星形图像具有固定的高度,但基于 Size Class 的自定义宽度。正如您在图片中看到的,我希望常规宽度相当大。

由于 Compact Width 没有安装宽度约束,它会根据星形图像的内在内容获取图像大小。 (来源:这颗星来自Use Your Loaf

问题

当我在运行 iPhone 8 Plus(iOS 11.1 和 Xcode 9.1)的模拟器中将设备从横向旋转到纵向时,我收到以下错误:

Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. 
Try this: 
    (1) look at each constraint and try to figure out which you don't expect; 
    (2) find the code that added the unwanted constraint or constraints and fix it.

....


Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6040002839d0 UIImageView:0x7fe177d0b940.width == 480   (active)>

很明显,即使我的视图更改为紧凑宽度(我指定未安装约束),此宽度约束仍然存在。为什么是这样?使用installed 是根据不同的大小类自定义自动布局约束的正确方法吗?不过,我看不到任何其他方法可以在 Storyboard 中实现它。

我尝试以编程方式创建宽度约束并改为从traitCollectionDidChange 内部设置.isActive,但我仍然遇到同样的错误。

我在测试来自Mysteries of Auto Layout WWDC talk 的示例代码时没有收到此类错误,就像我一样,它通过traitCollectionDidChange 停用/激活约束。

更新

我在GitHub 上添加了自己的代码。

【问题讨论】:

    标签: ios swift xcode autolayout size-classes


    【解决方案1】:

    您可以通过将宽度约束的优先级降低到 999 来消除此错误。

    我相信这个警告与自动布局引擎自动添加的UIView-Encapsulated-Layout-Width 约束有关。关于这种类型的约束有很多问题,但我没有找到任何好的答案它是什么以及它的作用是什么。我找到的最好的是thread

    <NSLayoutConstraint:0x60400008d110 'UIView-Encapsulated-Layout-Width' UIView:0x7ff1e5f08d20.width == 414   (active)>
    

    如果您在视图层次结构调试器中查看您的布局预览,您会看到所有约束在两个方向上都按预期设置。

    【讨论】:

    • 感谢您的回答。一开始我也确实注意到了这个限制,我认为以这种方式简单地消除错误可能只是隐藏了一个实际问题,我还不太确定它是什么。所以我更喜欢一个能真正解释正在发生的事情的答案。
    【解决方案2】:

    我遇到了类似的问题,我尝试在两个冲突的约束之间切换。我的问题是我正在激活冲突约束,而另一个也处于活动状态,我会收到此警告。

    尝试先停用有冲突的活动约束,然后再激活新的约束。这将消除警告。

    if isWide {
        wideConstraint.isActive = false
        narrowConstraint.isActive = true
    else {
        narrowConstraint.isActive = false
        wideConstraint.isActive = true
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      相关资源
      最近更新 更多