iOS6 自动布局异常
Posted
技术标签:
【中文标题】iOS6 自动布局异常【英文标题】:AutoLayout exceptions iOS6 【发布时间】:2014-01-22 07:52:43 【问题描述】:我目前正在使用带有自动布局的 xib 在集合视图中创建自定义单元格。我有两个方向的不同单元格大小。因此,我根据方向更改单元格的宽度和高度。
问题是,当我更改设备方向时,我会在 ios6 中收到大量警告/异常。
但是,当我在 iOS7 中执行相同操作时,没有警告。
虽然它不会影响我的功能,但我想删除所有这些警告。
这是我的XIB file
以下是我得到的错误/警告/异常。
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. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x164371f0 V:[UILabel:0x16437240(21)]>",
"<NSLayoutConstraint:0x16438050 V:[UILabel:0x16437240]-(1)-[UILabel:0x16437670]>",
"<NSLayoutConstraint:0x16437fd0 V:[UILabel:0x16437670]-(5)-| (Names: '|':LibraryCollectionViewCell:0x16436ae0 )>",
"<NSLayoutConstraint:0x16437f50 V:[UILabel:0x16436e10]-(0)-[UILabel:0x16437240]>",
"<NSLayoutConstraint:0x16437e90 V:|-(7)-[UILabel:0x16436e10] (Names: '|':LibraryCollectionViewCell:0x16436ae0 )>",
"<NSAutoresizingMaskLayoutConstraint:0x16354d00 h=--& v=--& V:[UICollectionView:0xb24f200(264)]>",
"<NSAutoresizingMaskLayoutConstraint:0x163513b0 h=-&- v=-&- LibraryCollectionViewCell:0x16436ae0.height == UICollectionView:0xb24f200.height - 264>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x164371f0 V:[UILabel:0x16437240(21)]>
Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
我尝试过[cell setTranslatesAutoresizingMaskIntoConstraints:NO]
,但它反而使应用程序崩溃。
谁能提供一些解决方案?
【问题讨论】:
【参考方案1】:"<NSLayoutConstraint:0x164371f0 V:[UILabel:0x16437240(21)]>",
"<NSLayoutConstraint:0x16438050 V:[UILabel:0x16437240]-(1)-[UILabel:0x16437670]>",
"<NSLayoutConstraint:0x16437fd0 V:[UILabel:0x16437670]-(5)-| (Names: '|':LibraryCollectionViewCell:0x16436ae0 )>",
"<NSLayoutConstraint:0x16437f50 V:[UILabel:0x16436e10]-(0)-[UILabel:0x16437240]>",
"<NSLayoutConstraint:0x16437e90 V:|-(7)-[UILabel:0x16436e10] (Names: '|':LibraryCollectionViewCell:0x16436ae0 )>",
"<NSAutoresizingMaskLayoutConstraint:0x16354d00 h=--& v=--& V:[UICollectionView:0xb24f200(264)]>",
"<NSAutoresizingMaskLayoutConstraint:0x163513b0 h=-&- v=-&- LibraryCollectionViewCell:0x16436ae0.height == UICollectionView:0xb24f200.height - 264>"
好的,根据您的限制...
(括号中的数字是参考的最后3位数字)。
Label (240) with height constraint fixed to 21.
Label (240) with a vertical gap of 1 to label (670).
Label (670) with a vertical gap of 5 to the superview (ae0) bottom.
Label (e10) with a vertical gap of 7 to the superview (ae0) top.
UICollectionView (200) with fixed height of 264.
LibraryCollectionViewCell (ae0) with an equal height to the collection view - 264 (200).
好的!有你的问题!亚当萨维奇>
列表中的最后一个约束将使单元格的高度为 0。(264 - 264 = 0) 但是,在单元格中,您有一个固定高度为 21 和固定垂直间隙为 7、5 和 1 的标签。
264 - 264 = 0
21 + 7 + 5 + 1 = 36
36 != 0
您可以通过多种方式解决此问题。移除单元格和集合视图之间的约束。移除标签上的固定高度约束。等等……
我建议您画出您希望它如何工作(在纸上)并写下您需要的限制条件。或者将您正在尝试做的事情的图片放入您的问题中,以便我们尝试提供帮助。
【讨论】:
你似乎是对的。但是,当我尝试删除垂直约束时,视图会扭曲。此外,在将其从横向旋转回纵向时,我收到H:
的警告
完全删除了自动布局并修复了自动调整大小蒙版的问题。无论如何都接受你的回答,因为它确实在我尝试时删除了警告。【参考方案2】:
Auto layout
从 iOS 6.0
到 iOS 7.0
的方式发生了很大变化。
这在通过X-Code 4.x
和X-Code 5.x
实现的自动布局中非常明显。
由于 Apple 现在希望应用程序可以在 X-Code 5.x 中构建,我建议使用相同的版本。
同时检查base SDK
。
【讨论】:
以上是关于iOS6 自动布局异常的主要内容,如果未能解决你的问题,请参考以下文章
具有动态视图数量和自动布局 iOS6 的 UIScrollView
UILabel sizeToFit 不适用于自动布局 ios6