带有AutoLayout的UICollectionView Cell + UiLabel

我试图将UILabel固定到它的父级单元格。 我添加了四个约束(顶部,领先,尾随,底部) ,在iOS 8.0上运行正常,但在iOS 7.X上运行不正常 。 请看下面的图片:

[点击此处查看全尺寸]

在这里输入图像说明

我究竟做错了什么? 请指教!

编辑#1

它似乎只是从Xcode 6通用以来就被打破了。 我的方法在Xcode 6 beta 7中工作正常。

此外,如果我减less内部视图的宽度,它会引发以下警告:

2014-09-10 19:58:28.109 Test[57827:60b] 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:0x799573a0 H:|-(8)-[UIView:0x798a86e0] (Names: '|':UIView:0x798ae5d0 )>", "<NSLayoutConstraint:0x799573d0 H:[UIView:0x798a86e0]-(43)-| (Names: '|':UIView:0x798ae5d0 )>", "<NSAutoresizingMaskLayoutConstraint:0x798a8b00 h=--& v=--& H:[UIView:0x798ae5d0(50)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x799573d0 H:[UIView:0x798a86e0]-(43)-| (Names: '|':UIView:0x798ae5d0 )> 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. 

覆盖自定义单元的layoutSubviews是一种可能的解决方法:

 override func layoutSubviews() { contentView.frame = bounds super.layoutSubviews() } 

UIView:0x798ae5d0是CollectionViewCell的contentView。 不知怎的,在某个时刻,它使用UICollectionViewCells的defaultSize(50.0,50.0)。

 <NSAutoresizingMaskLayoutConstraint:0x798a8b00 h=--& v=--& H:[UIView:0x798ae5d0(50)]> 

当你的水平边距8 + 43 = 51大于contentView(50)时,不可能满足布局。

 <NSLayoutConstraint:0x799573a0 H:|-(8)-[UIView:0x798a86e0] (Names: '|':UIView:0x798ae5d0 )> <NSLayoutConstraint:0x799573d0 H:[UIView:0x798a86e0]-(43)-| (Names: '|':UIView:0x798ae5d0 )> 

人们可以使布局更灵活,所以它也可以工作在(50.0,50.0)的尺寸上。 在你的情况下,通过改变等于43到<= 43或减less1000到750或999的优先级。

问题是你的自定义视图(UILabel)有约束,与单元格(或更好的单元格的contentView)的约束冲突。 单元格的NSAutoresizingMaskLayoutConstraint是根据您在xib(或storyboard)中的UICollectionView属性中设置的单元格大小自动创build的。 我通过明确设置解决了类似的问题(*)

 - (void)awakeFromNib { [super awakeFromNib]; self.contentView.translatesAutoresizingMaskIntoConstraints = NO; } 

在我的自定义UICollectionViewCell子类中。 这摆脱了Storyboard中设置的单元大小约束。

(*)免责声明:我的collectionView根据自己的内容视图自定义单元格,由自动布局定义。 我有关于我的内容自动布局的冲突限制和Storyboard中显式大小的警告。 这帮助我摆脱了这些警告。

而不是给予四个约束(顶部,领先,尾随,底部)。 尝试顶部,领先,宽度和高度。 它应该工作。

我希望你已经添加了相对于它的父类的约束(这将是UIViewController的视图),以便它的宽度和高度等于父视图。

在这里输入图像说明

在我的项目中发现了另外一个可能性。

通常我会复制/粘贴类似的对象,但是这样做有时会保存相同的ID。
所以我通过从头创build一个对象来解决我的约束问题。