当我设置了一个由Size Classes定制的自动布局约束,这个约束被安装在某些Size Class(es)中,而在其他Size Class(es)中没有安装时,我在运行时会收到这个不可满足的约束错误消息,但是在Interface Builder上的结果符合预期,没有错误/警告。
显然,即使我的视图改变为紧凑宽度,我指定不安装约束时,这个宽度约束仍然存在。为什么会这样?在Storyboard中使用
我正在测试什么
为了演示不可满足约束条件如何意外发生的简单示例,我希望星形图像具有固定的高度,但根据大小类别自定义宽度。如您在图像中所看到的,我希望它在常规宽度下非常大。
因为紧凑宽度下未安装宽度约束条件,所以它基于星形图像的内在内容获取图像大小。(来源:此星形图像来自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)>
显然,即使我的视图改变为紧凑宽度,我指定不安装约束时,这个宽度约束仍然存在。为什么会这样?在Storyboard中使用
installed
是基于不同的Size Class自定义自动布局约束的正确方式吗?但我没有看到其他实现方式。
我尝试通过编写代码创建宽度约束,并从traitCollectionDidChange
内部设置.isActive
,但仍然出现了相同的错误。
当我测试Mysteries of Auto Layout WWDC talk的示例代码时,我没有遇到这样的错误,该示例代码与我一样通过traitCollectionDidChange
来启用/禁用约束。
更新
我在GitHub上添加了自己的代码。