如何实现横向滚动UICollectionView中各Cell子视图跨Cell对齐布局
横向滚动UICollectionView对齐需求最优实现方案
你的原有思路核心逻辑是正确的,100个item的量级完全不需要担心性能问题,AutoLayout可以实现,效率和手动布局没有明显差异,且维护性更好,以下是优化后的落地方案:
实现步骤
- 预计算全局布局参数(仅在数据源初始化/变更时执行1次)
遍历所有model,对5个固定位置的子视图依次做统计:- 若所有model的对应字段都为空,记录该位置的高度为0,对应间距也设为0
- 若存在至少一个model对应字段非空,计算所有有数据的该子视图的最大高度,加上预设的垂直间距,记录为该位置的总高度
- 按顺序累加上方所有位置的高度,得到每个位置的顶部偏移量,同时算出所有Cell的统一总高度,把这些参数存在全局的数组/属性中即可
- Cell布局配置(仅在Cell初始化时执行1次,复用时不需要修改约束)
每个子视图直接用AutoLayout绑定两个约束即可:- 顶部约束等于contentView顶部加上预计算的对应位置偏移量
- 高度约束等于预计算的对应位置高度
复用时只需要做两个操作:给子视图赋值对应model的内容,若当前model对应字段为空,直接将子视图的hidden属性设为YES即可,不需要修改约束,全局统一的约束已经保证了同位置子视图的顶部对齐
- FlowLayout配置
直接将UICollectionViewFlowLayout的itemSize高度设为预计算的统一高度即可,宽度按你的业务需求设置即可。
原有思路可优化点
- 不需要每个Cell单独计算偏移量,全局统计1次即可,100个item的遍历耗时不足1ms,完全不影响性能
- 不需要手动计算frame,AutoLayout约束仅初始化一次,后续复用仅修改显示状态,比手动布局少了大量layoutSubviews里的frame计算代码,维护成本更低
- 不需要为单个Cell的子视图显隐修改约束,直接隐藏即可,空数据的子视图只是不可见,占位空间保留,刚好满足跨Cell对齐的要求;如果该位置全局无数据,预计算高度已经是0,不会占用任何布局空间,刚好匹配你的第二个需求。
性能说明
100个item的量级下,该方案无论是预计算阶段还是滚动复用阶段,都不会有性能问题。滚动过程中没有任何约束重计算操作,所有子视图的布局参数都是静态的,和常规的固定高度Cell滚动性能一致。
内容的提问来源于stack exchange,提问作者ashipma
相关产品推荐
相关产品推荐

