UICollectionViewCell自动布局

我在故事板中创build了一个简单的自定义UICollectionViewCell ,我也用相同的结果编程实现了这个function。

它有一个单独的UIImageView和两个UILabels ,如下所示:

  <--UIIMAGEVIEW--> <--UILABEL--------> |-(10px)- | | -(10px)- -(10px)-| <---------------> <--UILABEL--------> 

图像坐在左边,然后在右边是两个标签,上下彼此。

每个间隔有10个像素间隙,全部以单元Y轴为中心。 标签然后有一个常数来抵消他们从中心(上下)。

图像的高度和宽度固定为44px,标签的高度固定为20px(宽度可调)。

约束按预期工作,永远不会破坏应用程序,但它们总是吐出下面这个令人讨厌的控制台日志信息,因为它们显然正在破坏。

如果我将这一行添加到我的UICollectionViewCell子类中,约束不再中断并吐出控制台错误,但它们在屏幕上完全被破坏。

 [self.contentView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

任何线索? 请帮忙,这似乎是不合逻辑的!

这是控制台错误代码:

 2014-10-25 18:28:14.273 Air Plan[1579:580797] 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:0x17009edc0 H:[UIImageView:0x1701f7d00(44)]>", "<NSLayoutConstraint:0x17009f130 H:|-(10)-[UIImageView:0x1701f7d00] (Names: '|':UIView:0x170183810 )>", "<NSLayoutConstraint:0x17009f270 H:[UIImageView:0x1701f7d00]-(10)-[UILabel:0x155e59970'detailLbl']>", "<NSLayoutConstraint:0x17009f310 H:[UILabel:0x155e59970'detailLbl']-(10)-| (Names: '|':UIView:0x170183810 )>", "<NSAutoresizingMaskLayoutConstraint:0x17409eff0 h=--& v=--& H:[UIView:0x170183810(50)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x17009edc0 H:[UIImageView:0x1701f7d00(44)]> Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 2014-10-25 18:28:14.276 Air Plan[1579:580797] 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:0x17009fcc0 H:[UIImageView:0x1701fa800(44)]>", "<NSLayoutConstraint:0x17009ff40 H:|-(10)-[UIImageView:0x1701fa800] (Names: '|':UIView:0x170180a90 )>", "<NSLayoutConstraint:0x1702800a0 H:[UIImageView:0x1701fa800]-(10)-[UILabel:0x155e5b440'detailLbl']>", "<NSLayoutConstraint:0x170280140 H:[UILabel:0x155e5b440'detailLbl']-(10)-| (Names: '|':UIView:0x170180a90 )>", "<NSAutoresizingMaskLayoutConstraint:0x17409ea00 h=--& v=--& H:[UIView:0x170180a90(50)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x17009fcc0 H:[UIImageView:0x1701fa800(44)]> Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 2014-10-25 18:28:14.278 Air Plan[1579:580797] 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:0x170280a00 H:[UIImageView:0x1701fab00(44)]>", "<NSLayoutConstraint:0x170280c80 H:|-(10)-[UIImageView:0x1701fab00] (Names: '|':UIView:0x1701822f0 )>", "<NSLayoutConstraint:0x170280dc0 H:[UIImageView:0x1701fab00]-(10)-[UILabel:0x155e5cd10'detailLbl']>", "<NSLayoutConstraint:0x170280e60 H:[UILabel:0x155e5cd10'detailLbl']-(10)-| (Names: '|':UIView:0x1701822f0 )>", "<NSAutoresizingMaskLayoutConstraint:0x17409f180 h=--& v=--& H:[UIView:0x1701822f0(50)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x170280a00 H:[UIImageView:0x1701fab00(44)]> Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 2014-10-25 18:28:14.280 Air Plan[1579:580797] 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:0x170281090 H:[UIImageView:0x1701fae00(44)]>", "<NSLayoutConstraint:0x170281310 H:|-(10)-[UIImageView:0x1701fae00] (Names: '|':UIView:0x170182220 )>", "<NSLayoutConstraint:0x1702813b0 H:[UIImageView:0x1701fae00]-(10)-[UILabel:0x155e5d620'titleLbl']>", "<NSLayoutConstraint:0x170281400 H:[UILabel:0x155e5d620'titleLbl']-(10)-| (Names: '|':UIView:0x170182220 )>", "<NSAutoresizingMaskLayoutConstraint:0x17409fd60 h=--& v=--& H:[UIView:0x170182220(50)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x170281090 H:[UIImageView:0x1701fae00(44)]> Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 2014-10-25 18:28:14.282 Air Plan[1579:580797] 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:0x170281b80 H:[UIImageView:0x1701fb100(44)]>", "<NSLayoutConstraint:0x17409f4a0 H:|-(10)-[UIImageView:0x1701fb100] (Names: '|':UIView:0x170182150 )>", "<NSLayoutConstraint:0x17409f5e0 H:[UIImageView:0x1701fb100]-(10)-[UILabel:0x155d64210'detailLbl']>", "<NSLayoutConstraint:0x17409f680 H:[UILabel:0x155d64210'detailLbl']-(10)-| (Names: '|':UIView:0x170182150 )>", "<NSAutoresizingMaskLayoutConstraint:0x1742800f0 h=--& v=--& H:[UIView:0x170182150(50)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x170281b80 H:[UIImageView:0x1701fb100(44)]> Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 

我也面临这个问题,并通过在UICollectionViewCell子类中添加这个问题来解决它:

SWIFT 3

 override func awakeFromNib() { contentView.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight] } 

OBJC

 - (void)awakeFromNib{ self.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; } 

Xcode 6.1 iOS 8.0.2,8.1

你也可以检查这个答案: UICollectionView Cell + UiLabel与AutoLayout

刚创build好单元格和单元格的内容视图是50×50(无论集合布局设置的是多大)。

自动布局第一次工作后单元格得到正确的大小,但内容视图仍然是50×50。 可能是iOS 8的问题。 其他布局适用于正确的内容视图大小。 所以很好,你看到一个正确的布局,但日志输出散乱。

只需在awakeFromNib中设置较大的帧,然后将最小单元大小设置为iOS 8的内容视图。

在你的情况

 |-(10px)-UIImageView(44px)-(10px)-UILabel-(10px)-| 

最小单元格宽度是74 – 所有显式常量之和。

 - (void)awakeFromNib { [super awakeFromNib]; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.) { self.contentView.frame = CGRectMake(0, 0, 200, 100); } } 

有同样的问题,但设置auoresizingMask没有工作。 并设置框架解决了这个问题。

我也有这个问题。 添加:

 [self.contentView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

打破了我的看法布局。 在我的情况下,我不得不调整一些布局约束,以回到我想要的方式。 在一种情况下,图像不是垂直居中的,因为单元的高度没有被充分地限制。 (在那里,我添加了底部约束到单元格中的最低元素)。 在另一种情况下,另一个图像(在不同的单元格)没有居中,我不得不做出不同的约束条件变化。 我在该图像上添加了高度约束,并删除了顶部的约束,并解决了这个问题。

UILabel ,我也遇到了这两个单元格的问题,这些单元格不再局限于集合视图单元格的宽度。 也就是说,当文本太长时,文本不会很好地跟在单元格内的“…”,它只会跑过单元格的末尾。 在这两种情况下,唯一可以解决的问题是为标签添加一个固定宽度的约束,从而使标签的宽度无法自适应。 先前已经在设置translatesAutoresizingMaskIntoConstraints为NO之前工作过的尾随约束。