ios 需要使用组合布局在集合视图上实现分页/如何使用新的部分重置collectionViewLayout而不 Flink ?

62lalag4  于 2022-12-05  发布在  iOS
关注(0)|答案(1)|浏览(174)

bounty将在1分钟后过期。回答此问题可获得+50的声望奖励。Abhinav Jha正在寻找来自知名来源的答案

我有5个不同的部分,其中3个是在初始调用期间加载的,其余2个是在滚动(分页)期间加载的。如果我事先创建UICollectionViewCompositionalLayout,则数据将按照创建NSCollectionLayoutSection的顺序加载,这将导致我的数据加载到不同的部分,如果我在分页期间再次创建UICollectionViewCompositionalLayout,则集合视图将 Flink 。

func createHomeLayout(for collectionView: UICollectionView, sections: [SectionType]) -> UICollectionViewLayout {
    let layout = UICollectionViewCompositionalLayout { (sectionIndex: Int,
                                                        layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? in
        
        guard sectionIndex < sections.count else { return nil }
        
        let section = sections[sectionIndex]
        
       
        
        switch section {
            case .ba:
                return BaSectionCreator.create(for: collectionView.frame)
            case .br:
                return BrSectionCreator.create()
            case .ca:
                return CaSectionCreator.create()
            case .pr:
                return PrSectionCreator.create()
            case .re:
                return ReSectionCreator.create()
        }
    }
    return layout
}
ghhaqwfi

ghhaqwfi1#

您可以通过在初始调用加载前3个数据部分之前只创建一次UICollectionViewCompositionalLayout来避免集合视图 Flink 。然后,您可以使用UICollectionView的performBatchUpdates方法将新的数据部分插入到现有布局中。这将允许您插入新的数据部分,而无需重新创建整个布局,这将避免集合视图 Flink 。
下面是一个如何执行此操作的示例:

// Create the UICollectionViewCompositionalLayout before loading the first 3 sections of data.
let layout = createHomeLayout(for: collectionView, sections: [.ba, .br, .ca])
collectionView.setCollectionViewLayout(layout, animated: false)

// Load the first 3 sections of data.

// Handle pagination by inserting the new sections of data into the existing layout.
collectionView.performBatchUpdates({
    let newSections: [SectionType] = [.pr, .re]
    let newSectionsIndexSet = NSIndexSet(indexesIn: NSRange(location: 3, length: 2))
    collectionView.insertSections(newSectionsIndexSet as IndexSet)
}, completion: nil)

此方法可让您避免在后续分页呼叫时重新建立配置,这应该会避免集合检视 Flink 。请注意,您将需要更新createHomeLayout方法,以传回每一个区段类型的正确NSCollectionLayoutSection,包括在后续分页呼叫时加入的.pr和.re区段类型。

相关问题