带有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一个对象来解决我的约束问题。
- iOS的topLayoutGuide使用iOS 7和iOS 8之间的子视图控制器的区别
- 使用自定义animation时,会在iOS9上忽略edgesForExtendedLayout
- Xcode 5自动布局 – embedded表
- 通过自动布局在UIScrollView中使用顶层布局指南
- 如何使用自动布局以编程方式将活动指标定位到其超级视图的中心?
- 无法同时满足约束embedded在故事板中的AVPlayerViewController的警告
- iOS 8的自我大小单元不适用于UITableViewCellStyleSubtitle和numberOfLines = 0?
- UIScrollView的高度和contentOffsetanimation从底部“跳”内容
- 如何在animateTransition期间获取ToViewController中子视图的框架:?