首页 文章

UICollectionView中的UIViewController

提问于
浏览
19

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

鉴于每个"page"都相当复杂,因此每个页面本身都需要由关联的 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

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

3 回答

  • 8

    我做了同样的事情,但有两个视图控制器同时可见,并且可重新排序,因此集合视图是正确的选择 .

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

    如果细胞的新用途相似但不同 - 例如细胞的再利用是有意义的 . 您正在更改标签的文本或在图像视图中放置不同的图像 . 如果您正在拆除并替换整个视图层次结构,那么您并没有真正重用该单元格 .

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

    因此,简而言之 - 不要重复使用细胞 . 它比保持旧的更昂贵 . 向下滚动一百行表不同于滚动几个全屏视图 . 但是,鉴于您的全屏,滚动视图可能是更好的选择 .

  • 7

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

  • 7

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

    复杂性并不意味着你应该考虑采用UIViewController . UIViews也很复杂 . UIViewController的作用实际上是提供额外的封装和生命周期,它听起来并不像你需要的那样 .

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

相关问题