如何阻止第二个UICollectionView使用sizeForItemAt方法?
解决两个UICollectionView分别控制是否使用sizeForItemAt的问题
其实核心思路就是让需要自定义大小的CollectionView触发sizeForItemAt,另一个直接使用FlowLayout的默认配置,分两种常见场景来处理:
场景1:两个CollectionView共用同一个代理对象
如果你的两个CollectionView都用同一个UICollectionViewDelegateFlowLayout实现类,那只需要在sizeForItemAt方法里做个判断,只对目标CollectionView返回自定义大小,另一个返回FlowLayout的默认itemSize即可:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { // 先判断当前处理的是哪个CollectionView if collectionView == self.customSizeCollectionView { // 这里写你需要的自定义大小逻辑 return CGSize(width: 120, height: 120) } else { // 另一个CollectionView直接返回FlowLayout预设的itemSize guard let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout else { // 兜底返回一个默认值,防止类型转换失败 return CGSize(width: 60, height: 60) } return flowLayout.itemSize } }
场景2:两个CollectionView使用不同的代理对象
这种情况更简单:只给需要自定义大小的CollectionView的代理实现sizeForItemAt方法,另一个CollectionView的代理完全不实现这个方法就行。
因为sizeForItemAt是UICollectionViewDelegateFlowLayout中的可选方法,只要不实现,系统就会自动使用该CollectionView的FlowLayout里预先设置的itemSize作为单元格大小。
额外注意点
别忘了给不需要自定义大小的CollectionView的FlowLayout设置好默认的itemSize,比如初始化的时候:
let normalFlowLayout = UICollectionViewFlowLayout() normalFlowLayout.itemSize = CGSize(width: 70, height: 70) let normalCollectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 300, height: 400), collectionViewLayout: normalFlowLayout)
这样就能确保另一个CollectionView完全不依赖sizeForItemAt,只用预设的大小了。
内容的提问来源于stack exchange,提问作者jay123456
相关产品推荐
相关产品推荐

