UICollectionView 自动布局约束正在打破

Posted

技术标签:

【中文标题】UICollectionView 自动布局约束正在打破【英文标题】:UICollection View Auto-layout Constraints Are Breaking 【发布时间】:2015-08-26 02:37:31 【问题描述】:

我有一个带有 UICollectionView 的 ViewController。在情节提要中,我已经布置了单元格。

到我添加的单元格:

图像视图 图像视图嵌套在容器内 然后我在容器下面有一个标签

然后我在情节提要中添加了自动布局约束:

当我运行模拟器时,这不起作用。我认为它不起作用,因为我使用的是自定义单元格。因此,我通过为所有约束设置 IBOutlets 并在 cellForItemAtIndexPath 方法中重置它们的值来修复它并使其正常运行:

    //Layout cell
    cell.img_Height.constant = 50
    cell.img_Width.constant = 50
    cell.leading_Img_to_Container.constant = 10
    cell.trailing_Img_to_Container.constant = 10
    cell.top_Img_to_Container.constant = 10
    cell.bottom_Img_to_Container.constant = 10

    cell.top_Container_to_Cell.constant = 10
    cell.bottom_Container_to_Label.constant = 0
    cell.horizontalCenter_Container_to_Cell.constant = 0

    cell.bottom_Label_to_Cell.constant = 0 //Flexible constraint: In storyboard this relation is 'Greater than or equal to'
    cell.horizontalCenter_Container_to_Label.constant = 0

当我运行应用程序时,集合视图看起来不错。但是,当我检查控制台时,它说它正在打破约束:

无法同时满足约束。 以下列表中的至少一个约束可能是您不想要的。试试这个:(1)查看每个约束并尝试找出您不期望的; (2) 找到添加了一个或多个不需要的约束的代码并修复它。 (注意:如果您看到不理解的 NSAutoresizingMaskLayoutConstraints,请参阅 UIView 属性 translatesAutoresizingMaskIntoConstraints 的文档) ( "", "", "", "", "", "= UILabel:0x7fc0026d2580'杂货清单'.bottom>", “” ) 将尝试通过打破约束来恢复 NSLayoutConstraint:0x7fc0026ba9d0 V:[UIImageView:0x7fc0026d2440(50)]>

我一直在调整约束并尝试调试它,但我无法弄清楚我做错了什么。如何正确设置布局?

【问题讨论】:

【参考方案1】:

我能够通过消除我的图像所在的容器来解决我的问题,这简化了布局,因此也简化了所需的约束。

由于单元格是预先确定的大小,我的新方法只是将事物居中并确保它们的 y 位置相对于彼此是清晰的。

此时,我的约束:

使用大于 0 ( >=0 ) 来决定到单元格边缘的距离,并且优先级较低,因为无论如何都会发生这种效果,因为它们是居中的。 我的最高优先级约束确保单元格内的视图之间的空间量正确。

【讨论】:

【参考方案2】:
cell.img_Height.constant = 50
cell.img_Width.constant = 50
cell.leading_Img_to_Container.constant = 10
cell.trailing_Img_to_Container.constant = 10
cell.top_Img_to_Container.constant = 10
cell.bottom_Img_to_Container.constant = 10

您对 cell.img 添加了太多约束。 不需要top_Img_toContainer 和Bottom img_to_Container 约束。

有一个原则你需要知道。

您添加到情节提要的每个视图都必须有足够的约束(不多也不少)以确认它是:

宽度

身高

X 位置

Y 位置

【讨论】:

感谢您的建议,但只是注释掉了您指定的两行,控制台仍然给出相同的错误。

以上是关于UICollectionView 自动布局约束正在打破的主要内容,如果未能解决你的问题,请参考以下文章

自动布局约束:无法同时满足约束

如何以编程方式在 UICollectionView 上添加自动布局?

自动布局 UICollectionView iOS 8

从 UICollectionViewCell 到 ViewController 的自动布局约束

自定义布局中约束更改的动画 UICollectionView 项目

UICollectionView 单元格在swift中使用约束固定宽度和动态高度