为什么我会在不应该为大小类安装的约束上出现自动布局错误?

我正在使用iOS 8.我的笔尖具有自动布局和尺寸类别启用。 我在IB中做了两个布局,一个用于任何宽度/任何高度,另一个用于任何宽度/紧凑高度。 我已经在IBtesting了不同的方向和设备大小,并且在IB中没有约束问题。

现在,当我在手机上运行应用程序。 视图正确放置在肖像。 然后我把手机旋转到风景,我得到一个“无法同时满足约束”。 错误。 当我查看冲突约束列表时,我发现应该已经为横向布局卸载了一个约束。 旋转完成后,横向布局显示正确。

就好像iOS正试图在旧的约束被卸载之前用新的边界来布局视图。 这是iOS的一个已知的问题? 是否需要执行一个步骤来正确支持大小类?

我遇到了同样的问题。 非常沮丧! 起初,我将代码添加到了willTransitionToTraitCollection:withTransitionCoordinator:以检测newCollection是否是不需要约束的大小类。 如果是这样,那么我设置constraint.active = NO。

它做了诡计,但我讨厌的代码。 我只是想:“为什么我必须这样做?约束没有安装在新的尺寸等级上!”

然后我发现,如果我在界面生成器中将违规约束的优先级降低到999,我不再在旋转时在控制台中收到约束错误。 :-)再一次,世界都是对的。

我仍然认为这是一个iOS的错误,但我没有时间做一个示例项目来重现它。 我认为这种布局的不寻常之处在于,我有一个图像视图,当手机旋转到横向时,图像视图移动到完全不同的位置。

图像视图上的宽度约束对于任何大小类都有不同的常量,但是这是抛出一个exception。

接下来的事情是使用不同的宽度约束。 一个是为了紧凑的高度安装,另一个是安装其他的一切。 这仍然是抛出一个exception,即使应该没有安装破坏约束。

最后,我得到的解决scheme是有两个图像视图,一个用于常规布局,另一个用于高度紧凑。 一次只安装一个图像视图。 这工作没有例外,看起来完全一样。