19

我的应用程序有一个全屏显示UICollectionView。它水平滚动,每个单元格填充集合视图的边界。集合视图由UIViewController.

鉴于每个“页面”都相当复杂,因此每个页面本身由关联的UIViewController. iOS 5 支持视图控制器包含,因此viewWillAppear:当视图被附加和分离时,子控制器应该接收适当的生命周期方法(例如,等)。这与视图回收有多大的关系?

从页面“1”滚动到“2”,将创建一个新视图(因为在触地期间两者都可以同时在屏幕上)。从页面“2”移动到“3”,UICollectionView可以成功地将页面“1”的视图出列,但是现在会发生什么?我会像这样强行将视图插入视图控制器三吗?

id cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ident" forIndexPath:indexPath];
UIViewController *child_controller = [self controllerAtIndexPath:indexPath];
[child_controller setView:cell];
// ... and so on

这感觉不对。但是,我想不出在这种情况下正确重用视图的正确方法。我完全采取了错误的方法吗?

4

3 回答 3

8

我认为这不是UICollectionView您任务的最佳选择。
就像rob mayoff说的:你可以使用UIPageViewController.
另一个选项可以UIScrollView与 3 个子视图(上一个、当前、下一个)一起使用。并且您将能够轻松管理它的位置和滚动视图偏移以达到您想要的效果。
这在 WWDC 2011 'Advanced Scrollview Techniques'中有描述。您可以从那里获取源代码。

于 2013-06-29T21:19:26.170 回答
7

我也做过同样的事情,但是两个视图控制器同时可见,并且可以重新排序,所以集合视图是正确的选择。

事实证明,删除前一个视图控制器的视图并添加一个新视图会导致滚动性能受到很大影响,而删除视图是最慢的方法。

仅当单元格的新用途相似但不同时,单元格的重用才有意义 - 例如,您正在更改标签的文本或在图像视图中放置不同的图像。如果您要删除并替换整个视图层次结构,那么您并没有真正重用单元格。

我最终做的是为每个可以包含的视图控制器使用新的单元格。在我的情况下,单元格的数量是有限制的,这意味着同时使用这么多视图控制器并没有真正的内存消耗问题。

所以,简而言之 - 不要重复使用单元格。这比保留旧的要贵。向下滚动一百行表格与滚动几个全屏视图不同。但是,鉴于您的屏幕是全屏的,滚动视图可能是更好的选择。

于 2013-06-29T21:47:49.773 回答
6

使用 UIView 子类(或 UICollectionViewCell 子类)可能比封装的 UIViewController 更好。封装的 UIViewController 必须了解其父视图控制器,这可能会导致代码可维护性问题。

复杂性并不意味着您应该考虑采用 UIViewController。UIViews 也可能非常复杂。UIViewController 的作用实际上是提供额外的封装和生命周期,这听起来不像你在这里需要的。

正如其他人所说, UIPageViewController 似乎也是一个不错的选择,但我不知道您的具体情况。

于 2013-07-03T23:40:29.483 回答