ios 6自动布局约束错误

Posted

技术标签:

【中文标题】ios 6自动布局约束错误【英文标题】:ios 6 auto layout constraints error 【发布时间】:2013-01-25 21:18:31 【问题描述】:

我的 iPad 项目中出现自动布局约束错误。当我将设备旋转到横向时,我在 IB 中创建的自定义 UICollectionViewCell 会发生这种情况。问题是没有一个约束是可删除的。我仍在学习自动布局,所以我确信这可能只是添加一些限制并删除一些默认限制的问题,但我被卡住了。我的自定义单元格肯定会发生这种情况 - 当我删除它并使用普通的旧 UICollectionViewCell 时,我没有收到任何错误。

我四处搜索并尝试将自定义单元格上的 translatesAutoresizingMaskIntoConstraints 设置为 NO,但随后出现以下错误:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“执行 -layoutSubviews 后仍需要自动布局。 UICollectionView 的-layoutSubviews 实现需要调用super。'

在我的自定义单元格的子视图上将其设置为 NO 可以正常工作,但是当我在单元格本身上设置它时它会出错。

这是我得到的自动布局约束错误 - 这是常见的错误:

可能至少以下列表中的一个约束是您不想要的。试试这个:(1)查看每个约束并尝试找出您不期望的; (2) 找到添加了一个或多个不需要的约束的代码并修复它。 (注意:如果您看到不理解的 NSAutoresizingMaskLayoutConstraints,请参阅 UIView 属性 translatesAutoresizingMaskIntoConstraints 的文档)

( "NSAutoresizingMaskLayoutConstraint:0x76bf950 h=-&- v=-&- CMAGalleryCollectionViewCell:0x7687690.height == UICollectionView:0x9161e00.height - 875",

"NSAutoresizingMaskLayoutConstraint:0x76693c0 h=--& v=--& V:[UIView:0x7665470(704)]",

"NSLayoutConstraint:0x7665850 UICollectionView:0x9161e00.bottom == UIView:0x7665470.bottom",

“NSLayoutConstraint:0x7665740 V:|-(0)-[UICollectionView:0x9161e00](名称:'|':UIView:0x7665470)” )

将尝试通过打破约束来恢复 NSLayoutConstraint:0x7665850 UICollectionView:0x9161e00.bottom == UIView:0x7665470.bottom

非常感谢任何帮助或建议。

谢谢!

【问题讨论】:

请同时包含错误日志中的约束列表 抱歉这个愚蠢的问题,但我究竟在哪里可以找到错误日志? 就在您上面引用的错误下方。它将是尖括号内的约束列表。 哦,对了。添加到原始消息中。谢谢。 【参考方案1】:

我经常遇到这种情况。当您旋转设备/应用程序时,视图的宽度/高度会发生变化以适应新的方向屏幕,这通常会破坏“width = 320”类型约束。

在我阅读以下内容之前,我发现上面的异常是不可读的: http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/formatLanguage.html

...类似于显示的格式,然后很容易看出问题所在。

您看到的不可删除约束可以更改。您可以将优先级从 1000 降低到可以破坏的东西,或者您可以将它们替换为有效的东西。一种(不完美的)方法可能是制定规则 >= 320 以便横向拉伸,或者您可以添加自己的约束来提供(也许将视图绑定到它的超级视图,然后宽度约束应该是可删除的。)说,这不是一个好的解决方案。

我建议您通常尝试在可能对主视图的形状/大小做出反应的某些东西(例如大型集合视图)上删除宽度和高度限制,因为这些宽度/高度通常是50% 的方向错误。

说了这么多,这是说单元格高度是集合高度减去875吗?

CMAGalleryCollectionViewCell:0x7687690.height == UICollectionView:0x9161e00.height - 875",

这个单元格是集合视图的子视图,而不是单元格的模板吗?我也遇到了界面构建器和集合的问题。我不得不在 IB 中从头开始重建集合视图,以免添加虚假的子单元格。

【讨论】:

谢谢,让我试试这个,我会告诉你的。 还是不明白怎么看是怎么回事。我将错误添加到我的原始帖子中。我可以从“NSLayoutConstraint:0x7665850 UICollectionView:0x9161e00.bottom == UIView:0x7665470.bottom”看出它抱怨将集合视图的底部与父视图绑定。我无法确定这个“NSLayoutConstraint:0x7665740 V:|-(0)-[UICollectionView:0x9161e00] (Names: '|':UIView:0x7665470)”的头或尾,我不确定为什么会有自动调整大小的掩码或为什么当我尝试在我的自定义单元格上设置 translatesAutoresizingMaskIntoConstraints 时出现错误。 V = 垂直,| = superview, -(0)- = no separator ... 所以将集合视图的底部绑定到主视图的底部。当设备上的视图空间不是 875 高时,我怀疑这会与高度 875 竞争。有帮助吗? 顺便说一句:主 UIView 上的 translatesAutoresizingMaskIntoConstraints 允许这些特殊约束(不受设置自定义单元格的影响。)它们可能看起来很老派,但实际上它们在调整大小方面做得很好视图(指向屏幕尺寸。) 有趣...我在 IB 中构建了 CMAGalleryCollectionViewCell,并在 Storyboard 中构建了带有集合视图的视图,所以我不确定 CMAGalleryCollectionViewCell:0x7687690.height == UICollectionView:0x9161e00.height 的确切位置- 875 约束源自。我会看看我是否能找到它,但也许它是由集合视图的 collectionViewLayout 定义的,特别是我为横向视图定义的 UIEdgeInsets?谢谢!

以上是关于ios 6自动布局约束错误的主要内容,如果未能解决你的问题,请参考以下文章

如何管理适用于 iOS 7 和 iOS 6.0 的自动布局约束

约束/自动布局栏隐藏,Xcode 6

swift 在Xcode 6 GM + iOS 7.1中修复UICollectionViewCell损坏的自动布局约束

为啥我会在不应为 size 类安装的约束上收到自动布局错误?

iOS 自动布局错位视图的错误

我们可以在 iOS 6 自动布局生成的帧上产生 CGRectIntegral 的效果吗?