StackView中使用Compositional Layout的自适配UICollectionView高度为0问题求助
问题解决步骤
1. 确认CollectionView基础配置
两个UICollectionView都需要关闭滚动能力,否则内容尺寸计算逻辑会受滚动视图机制干扰,大概率返回错误的0高度:
yourCollectionView.isScrollEnabled = false
2. 提升CollectionView的抗压缩/抗拉伸优先级
垂直UIStackView默认会对子视图的高度做动态调整,你需要把两个CollectionView的垂直方向优先级拉高,避免被系统压低高度:
// 两个CollectionView都要设置 collectionView.setContentHuggingPriority(.required, for: .vertical) collectionView.setContentCompressionResistancePriority(.required, for: .vertical)
3. 修正自适配CollectionView的实现
你的当前实现依赖contentSize更新触发固有尺寸刷新,但Compositional Layout的尺寸计算依赖CollectionView本身的宽度,你需要补充布局变更时的刷新逻辑:
override var contentSize: CGSize { didSet { invalidateIntrinsicContentSize() } } override var intrinsicContentSize: CGSize { // 避免初始状态返回0高度 contentSize.height <= 0 ? CGSize(width: UIView.noIntrinsicMetric, height: 0) : contentSize } override func layoutSubviews() { super.layoutSubviews() // 宽度变更后强制刷新固有尺寸,确保依赖宽度计算的Compositional Layout能拿到正确的内容高度 invalidateIntrinsicContentSize() }
4. 检查CollectionView的添加方式
确认两个CollectionView都是通过addArrangedSubview方法添加到对应UIStackView中的,普通addSubview不会被StackView纳入自动约束管理,会导致高度为0。
5. 数据源加载完成后手动触发布局
如果你是异步加载CollectionView的数据源,在数据赋值、reloadData之后手动触发一次布局更新:
collectionView.reloadData() collectionView.layoutIfNeeded()
内容的提问来源于stack exchange,提问作者Kwoner
相关产品推荐
相关产品推荐

