Ios 如何保护集合视图子视图不被重用

Ios 如何保护集合视图子视图不被重用,ios,uicollectionview,Ios,Uicollectionview,UICollectionView允许您为单元项、补充视图和装饰视图定义自定义视图。这些都必须是UICollectionReusableView的子类,以便collection视图可以在屏幕外处理它们以节省资源 但是,我想添加一个与集合视图的其余内容一起滚动的视图,但它永远不会被处理。这是因为该视图包含一些我不希望在视图控制器中管理的复杂状态(说来话长)。此视图有点像装饰视图,因为它不依赖于UICollectionViewDatasource提供的数据 那么什么是有效的方法呢 备选案文1。有没有办

UICollectionView允许您为单元项、补充视图和装饰视图定义自定义视图。这些都必须是UICollectionReusableView的子类,以便collection视图可以在屏幕外处理它们以节省资源

但是,我想添加一个与集合视图的其余内容一起滚动的视图,但它永远不会被处理。这是因为该视图包含一些我不希望在视图控制器中管理的复杂状态(说来话长)。此视图有点像装饰视图,因为它不依赖于UICollectionViewDatasource提供的数据

那么什么是有效的方法呢

备选案文1。有没有办法使其成为装饰视图,但以某种方式标记它,以便集合视图在屏幕外时永远不会处理它

备选案文2。如果不是,那么利用集合视图作为滚动视图的功能,将其作为普通子视图添加到集合视图中是否是最佳选择?集合视图是否明确支持这一点,或者手动添加子视图可能会破坏集合视图自身的布局管理

备选案文3。如果集合视图不支持这一点,那么对于这种情况是否还有其他常规的最佳实践?例如,我可以将类似装饰的视图作为兄弟视图添加到集合视图中,然后尝试连接到集合视图的平移手势识别器中,但这让人感觉既粗糙又脆弱

此视图包含一些我不希望在视图控制器中管理的复杂状态

这是问题的根源。使用视图存储状态从来都不是一个好主意。您说您正在寻找“最佳实践”,但事实是,最佳实践是将状态管理代码从视图中移到模型对象中


模型和视图之间的分离很大程度上是由于您发现的原因——视图的生命周期、关系和职责与模型类不同。任何试图将视图转换为模型类的问题解决方案都可能会给您一种脆弱、粗糙的感觉。

我的问题似乎是重复的(至少在页眉或页脚视图的特殊情况下)

答案表明,一种解决方案是使用
UICollectionView
上的
contentInset
属性为页眉或页脚创建空间,然后手动将它们作为子视图添加到该空间中

另一个对我有效的解决方案是将UICollectionViewFlowLayout子类化以创建额外的空间,而不是使用
contentInset


但是,使用
contentInset
显然更简单。我能看到的唯一区别是,基于inset的方法意味着集合视图的
contentSize
只反映它管理的单元格,而不是手动添加的页眉和页脚视图。我看不出有任何问题。

尝试查看
集合视图headerview
或页脚视图。这些是补充视图,因此它们可能会被集合视图自行销毁。这正是我试图避免的。你可以遵循这一点或避免麻烦,只需将子视图添加到集合视图的superview。是的,似乎我需要将子视图添加到集合视图(因此我控制其初始化和生存期),但还需要实现自定义布局(所以集合视图会列出它的内容偏移量,这样它就不会崩溃到我手动添加的子视图中)。我知道这一点。这就是为什么我说那部分是“长话短说”的原因。尽管如此,我还是想知道是否有方法添加跟踪UICollectionView内容的子视图,而不作为可重用单元进行管理。这是内置UITableView通过tableHeaderView和tableFooterView提供的,因此可能存在有效的使用案例。