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

时间:2014-07-05 17:09:25

标签: ios uicollectionview

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

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

那么有效的方法是什么?

选项1.有没有办法让这个装饰视图,但不知何故标记它,以便集合视图在屏幕外时永远不会丢弃它?

选项2.如果没有,是否只是将其作为普通子视图添加到集合视图中的最佳替代方法,利用集合视图的功能作为滚动视图?这是否明确支持集合视图,或者我是否有风险手动添加子视图会破坏集合视图自己的布局管理?

选项3.如果集合视图不支持此功能,那么此案例是否还有另一种传统的最佳做法?例如,我可以将类似装饰的视图作为兄弟添加到集合视图中,然后尝试挂钩到集合视图的平移手势识别器,但这会让人感到烦躁和脆弱。

2 个答案:

答案 0 :(得分:0)

  

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

这是问题的根源。使用视图存储状态永远不是一个好主意。你说你正在寻找一个“最佳实践”,但问题的真相是最好的做法是将状态管理代码移出视图并转移到模型对象中。

模型和视图之间的分离几乎就是你发现的原因 - 视图与模型类有不同的生命周期,关系和责任。尝试将视图转换为模型类的问题的任何解决方案都可能会给您带来那种脆弱,hacky的感觉。

答案 1 :(得分:0)

似乎我的问题是How to add HeaderView in UICollectionView like UITableView's tableHeaderView的重复(至少在页眉或页脚视图的特殊情况下)。

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

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

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