UICollectionViewFlowLayout尺寸与间距计算逻辑问题咨询
UICollectionViewFlowLayout 尺寸与间距计算规则(当前场景适配)
一、item尺寸计算逻辑
你场景中item最终为50×50px的原因如下(对应已解决的第一个疑问):
- 代码中设置了
layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize,开启了cell自动尺寸适配,此时IB中设置的200×200固定尺寸会直接被忽略 - 你的cell内部仅放置了一个无内容的UILabel,没有其他约束撑开cell,系统会默认返回
UICollectionViewFlowLayout的内置默认item尺寸:50×50pt,换算为你设备的像素单位后就是你看到的50×50px - 如果需要使用IB设置的固定尺寸,要么将
estimatedItemSize修改为对应固定值,要么关闭自动尺寸,实现sizeForItemAt代理方法返回指定尺寸即可。
二、interitem间距计算逻辑
基础排布规则
UICollectionViewFlowLayout的水平行布局严格遵循以下逻辑:
- 先扣除当前section的左右内边距(你设置的
sectionInset.left=20、sectionInset.right=20),得到当前行的可用宽度W - 从行左边缘开始依次摆放item,相邻两个item的间距不能小于你设置的
minimumInteritemSpacing - 摆放完k个item后,如果剩余可用宽度 < 下一个item的宽度 +
minimumInteritemSpacing,就停止当前行的摆放,剩余的所有空间会平均分配给当前行所有相邻item的间距,保证该行item均匀分布。
对应你的疑问解答
为什么
minimumInteritemSpacing设为5时,实际间距是7.5px?
你每个section只有3个item,计算可得3个item的总宽度 + 2*5px 小于行可用宽度,剩余的额外空间会平均分给2个相邻间距,最终得到的实际间距就是7.5px,该值大于你设置的最小间距5px,符合布局规则。为什么
minimumInteritemSpacing设为10-25时,实际间距都为26.5px?
当最小间距设置到10及以上时,3个item的总宽度 + 2*10px 已经超过了行可用宽度,一行放不下3个item,只能放下2个。此时当前行仅有2个item,只存在1个相邻间距,所有剩余空间都会分给这个间距,最终得到的实际间距就是26.5px。只要你设置的最小间距没有大到让一行只能放下1个item,实际间距都会固定为26.5px,和你设置的最小值无关。
内容的提问来源于stack exchange,提问作者Andrei Herford
相关产品推荐
相关产品推荐

