UICollectionView自定义列表cell出现AutoLayout约束冲突警告如何解决?
问题原因分析
- 疑问1解答:Xcode提示打破60高度约束但实际显示正常,是因为约束冲突发生在布局的早期计算阶段,系统后续会根据你的内容重新调整cell的高度,最终渲染时还是会以你的60高度为准,所以测量结果符合预期,警告只是中间过程的冲突提示。
- 疑问2解答:44高度的约束是UICollectionView列表类型的默认行高,系统默认给列表cell的高度预设为44,这个值是系统框架内置的,不是你代码里手写的,所以全局搜索不到。这个约束是AutoresizingMask自动转换过来的,对应你报错里的
NSAutoresizingMaskLayoutConstraint。
解决方案
你可以按以下步骤修改消除警告:
- 优先修复约束缺失导致的崩溃问题,你可以二选一确定contentsView的高度规则:
- 方式一:保留
contentsView.heightAnchor.constraint(equalToConstant: 60)这条约束,把它的优先级调整为低于系统默认优先级(低于1000即可),避免和系统初始的44高度约束冲突,修改后的约束代码如下:
contentsView.translatesAutoresizingMaskIntoConstraints = false let heightConstraint = contentsView.heightAnchor.constraint(equalToConstant: 60) heightConstraint.priority = .init(rawValue: 999) NSLayoutConstraint.activate([ contentsView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor), contentsView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor), contentsView.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor), contentsView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor), heightConstraint ])- 方式二:删除固定60高度约束,给statusLabel补全底部约束,让子视图内容自动撑开contentsView高度,在statusLabel的约束配置里新增一行:
statusLabel.bottomAnchor.constraint(equalTo: contentsView.bottomAnchor, constant: -8) - 方式一:保留
- 同步修改UICollectionView的列表行高配置,覆盖默认的44高度:
如果你使用的是UICollectionViewCompositionalLayout列表配置,可直接指定行高为绝对高度60:
如果你使用的是let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .absolute(60)) let item = NSCollectionLayoutItem(layoutSize: itemSize) // 后续正常配置组和布局即可UICollectionViewFlowLayout,直接设置全局item高度:flowLayout.itemSize = CGSize(width: collectionView.bounds.width, height: 60)
内容的提问来源于stack exchange,提问作者Yuuu
相关产品推荐
相关产品推荐

