Ios 尺寸等级';d自动布局:为错误的尺寸类别激活约束

Ios 尺寸等级';d自动布局:为错误的尺寸类别激活约束,ios,swift,xcode,autolayout,size-classes,Ios,Swift,Xcode,Autolayout,Size Classes,当我设置了一个由大小类定制的自动布局约束时,这样约束安装在某个大小类中,而不是在其他类中,我会在运行时获得这个不满意的约束错误消息,但结果在Interface Builder上是预期的,没有错误/警告 我在测试什么 对于这个简化的示例,为了演示不可满足的约束是如何意外发生的,我希望星形图像具有固定的高度,但具有基于大小类的自定义宽度。正如你在图中所看到的,我希望它对于规则宽度来说相当大 因为宽度约束不是为紧凑宽度安装的,所以它根据星图的内在内容获取图像大小。(来源:这位明星来自) 问题 在运

当我设置了一个由大小类定制的自动布局约束时,这样约束安装在某个大小类中,而不是在其他类中,我会在运行时获得这个不满意的约束错误消息,但结果在Interface Builder上是预期的,没有错误/警告

我在测试什么 对于这个简化的示例,为了演示不可满足的约束是如何意外发生的,我希望星形图像具有固定的高度,但具有基于大小类的自定义宽度。正如你在图中所看到的,我希望它对于规则宽度来说相当大

因为宽度约束不是为紧凑宽度安装的,所以它根据星图的内在内容获取图像大小。(来源:这位明星来自)

问题 在运行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)>
无法同时满足约束。
可能下面列表中至少有一个约束是您不想要的。
试试这个:
(1) 看看每一个约束,试着找出你不期望的;
(2) 找到添加了不需要的约束的代码,然后修复它。
....
将尝试通过打破约束进行恢复
因此,很明显,即使在视图更改为“压缩宽度”(我指定未安装该约束)时,此宽度约束仍然存在。为什么会这样?使用
installed
是根据不同的尺寸等级自定义自动布局约束的正确方法吗?不过,我在故事板上看不到任何其他方法来实现它

我尝试以编程方式创建宽度约束,并从内部设置
.isActive
traitCollectionDidChange
,但仍然出现相同的错误

在测试中的示例代码时,我没有遇到这样的错误,它通过
traitCollectionDidChange
禁用/激活约束,就像我做的那样

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

您可以通过将宽度约束的优先级降低到999来消除此错误。 我认为此警告与自动布局引擎自动添加的
UIView封装布局宽度
约束有关。关于这种类型的约束有很多问题,但我没有找到任何好的答案,它是什么,它的作用是什么。我发现最好的就是这个


如果在视图层次调试器中查看布局的预览,您将看到所有约束都按照预期在两个方向上进行了设置


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

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

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

谢谢你的回答。我一开始也注意到了这个限制,我认为通过这种方式简单地消除错误可能只是隐藏了一个实际的问题,我还不太确定它是什么。所以我更喜欢一个能解释到底发生了什么的答案。
if isWide {
    wideConstraint.isActive = false
    narrowConstraint.isActive = true
else {
    narrowConstraint.isActive = false
    wideConstraint.isActive = true
}