Swift中UIScrollView内嵌UICollectionView使用Auto Layout不显示问题咨询
修复方案
你可以按照以下步骤逐一调整配置解决显示异常问题:
1. 清理containerView的冗余约束
UIScrollView的contentSize由内部子视图的四边约束自动计算,你当前给containerView添加的两行低优先级约束属于冗余配置,会干扰高度计算,直接删除即可:
// 删除以下两行代码 containerView.heightAnchor.constraint(equalTo: self.heightAnchor).priority = .defaultLow containerView.widthAnchor.constraint(equalTo: self.widthAnchor).priority = .defaultLow
2. 修正UICollectionView的宽度约束冲突
你当前配置的collectionView总宽度(leading缩进+自身宽度)已经超过了containerView的可用宽度,会触发约束异常导致布局失效。建议删除固定宽度约束,改用trailing锚点适配容器宽度:
// 删除原来的widthAnchor约束 // inviteUsersCollectionView.widthAnchor.constraint(equalToConstant: frame.width * (309 / IPHONE8_SCREEN_WIDTH)).isActive = true // 新增trailing约束 inviteUsersCollectionView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: -frame.width * (22 / IPHONE8_SCREEN_WIDTH)).isActive = true
3. 给UICollectionView添加高度约束
UICollectionView默认不会根据内容自动计算高度,缺少高度约束会导致无法撑开containerView,也会导致自身无法正常渲染,根据你的业务需求二选一即可:
- 如果你需要collectionView跟随外层scrollView一起滚动:给collectionView添加动态高度约束,每次collectionView数据刷新后,更新高度约束的constant为collectionView内容的实际高度。
- 如果你需要collectionView独立滚动:给collectionView添加固定高度约束,例如:
inviteUsersCollectionView.heightAnchor.constraint(equalToConstant: 300).isActive = true
4. 配置UICollectionViewFlowLayout的item大小
如果你的cell是自适应大小,需要给flowLayout开启自动尺寸计算,避免内容渲染异常:
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() // 新增以下配置 layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize // 如果是固定尺寸的cell,直接设置itemSize即可 // layout.itemSize = CGSize(width: 你的cell宽度, height: 你的cell高度)
5. 检查上游组件约束
确认inviteUsersLabel已经正确添加到containerView上,且自身的top、leading、width约束配置正确,避免因为上游组件位置异常导致collectionView被推出屏幕可视范围。
内容的提问来源于stack exchange,提问作者Melodias
相关产品推荐
相关产品推荐

