Objective c UICollectionView,具有特定于分区的布局和粘性标题

Objective c UICollectionView,具有特定于分区的布局和粘性标题,objective-c,Objective C,我正在构建一个包含两个部分的UICollectionView。每个截面都有自己的布局-第一个截面是2×y轴网,第二个截面是3×y轴网。除了特定于部分的布局之外,我还需要粘性标题(例如默认情况下合并到UITableView中的标题) 我已经构建了UICollectionViewFlowLayout的一个功能齐全的子类,它可以适当地处理特定于小节的布局和粘性标题。但是,该解决方案不能很好地扩展到两个部分的250多个单元。我做了一些分析和调查,问题的根源似乎是应该为边界设置验证布局。我在我的子类中返回

我正在构建一个包含两个部分的UICollectionView。每个截面都有自己的布局-第一个截面是2×y轴网,第二个截面是3×y轴网。除了特定于部分的布局之外,我还需要粘性标题(例如默认情况下合并到UITableView中的标题)

我已经构建了UICollectionViewFlowLayout的一个功能齐全的子类,它可以适当地处理特定于小节的布局和粘性标题。但是,该解决方案不能很好地扩展到两个部分的250多个单元。我做了一些分析和调查,问题的根源似乎是
应该为边界设置验证布局
。我在我的子类中返回
YES
,因为需要在用户滚动时动态计算我的补充视图(标题)。这会导致补充视图和单元布局失效,这意味着流布局会反复调用单元上的
prepareLayout
,尽管单元布局实际上不需要失效,因为它们没有改变。当每个刷新周期需要布局的单元数量逐渐增加到数百或数千个时,性能会显著下降

我尝试过的

我在第一次计算时缓存单元格的
UICollectionViewLayoutAttribute
,允许流布局在系统调用
LayoutAttribute ForItemAtIndexPath
时引用缓存。当我不断地使布局无效时,以这种方式缓存的优势就会消失,因为
prepareLayout
每次都会运行它并重新填充缓存。我尝试实现一个系统,在该系统中,
prepareLayout
只在第一次传递时填充缓存,在后续传递时不执行逻辑。这极大地提高了性能,并起到了作用,但在插入和删除单元格时,解决方案出现故障,导致断言失败


我还对粘性标题的其他实现和涉及一致失效的类似布局要求做了大量研究,但这些解决方案都不需要同时解决我遇到的特定于部分的布局问题。因此,他们推荐的解决方案不可行。在这一点上我有点不知所措…

对于任何有兴趣实现类似功能的人,这里是我得出的解决方案。此解决方案避免了将默认的
shouldInvalidateLayoutForBoundsChange
设置为
YES
,从而节省大量CPU开销,同时保持粘性头的完整性

我手动将标题添加为
self.collectionView
的子视图,并编写了跟踪
self.collectionView.contentOffset.y
的方法,以便在内容滚动时适当地浮动和粘贴标题。这个解决方案的一个警告是,它不能很好地扩展到更多的部分;通过手动添加视图,您将失去
UICollectionReusableView
的一些好处,例如排队和回收。在我的实现中,最多有5个部分,因此牺牲最小