如何为使用UICollectionViewFlowLayout与UICollectionViewDiffableDataSource的UICollectionView添加分区页眉/页脚?
UICollectionViewFlowLayout 配合 DiffableDataSource 触发 supplementaryViewProvider
DiffableDataSource 的 supplementaryViewProvider 并非只能和 CompositionalLayout 配合,在 FlowLayout 下只要完成以下配置,就能正常触发该回调:
1. 注册补充视图
先为 CollectionView 注册你需要的补充视图(比如 section header/footer):
collectionView.register(SectionHeaderView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "SectionHeaderID")
2. 配置 FlowLayout 的补充视图尺寸
FlowLayout 必须明确设置补充视图的尺寸,否则系统会判定无需加载补充视图,不会触发 provider:
let flowLayout = UICollectionViewFlowLayout() // 设置header尺寸,footer同理修改为footerReferenceSize flowLayout.headerReferenceSize = CGSize(width: collectionView.bounds.width, height: 56) collectionView.collectionViewLayout = flowLayout
3. 初始化 DiffableDataSource 时绑定 supplementaryViewProvider
在数据源初始化阶段正常配置 provider,注意匹配注册的视图复用ID和 kind:
let dataSource = UICollectionViewDiffableDataSource<SectionType, ItemType>(collectionView: collectionView) { collectionView, indexPath, item in // 常规Cell配置逻辑 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CellID", for: indexPath) as! CustomCell cell.configure(with: item) return cell } // 绑定补充视图Provider dataSource.supplementaryViewProvider = { collectionView, kind, indexPath in guard kind == UICollectionView.elementKindSectionHeader else { return nil } let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "SectionHeaderID", for: indexPath) as! SectionHeaderView // 根据当前section配置视图 let section = dataSource.snapshot().sectionIdentifiers[indexPath.section] header.titleLabel.text = section.headerTitle return header }
关键注意事项
- 确保
supplementaryViewProvider中处理的kind与注册、FlowLayout 配置的类型完全一致(比如区分 header 和 footer) - 若未设置 FlowLayout 的
headerReferenceSize/footerReferenceSize,即使注册了视图,系统也不会调用 provider - 更新 DiffableDataSource 的 snapshot 时,只要对应 section 存在,provider 会自动触发更新补充视图
内容的提问来源于stack exchange,提问作者Savan Kavaiya
相关产品推荐
相关产品推荐

