You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止第二个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:38:05