【问题标题】:UIViewController within UICollectionViewUICollectionView 中的 UIViewController
【发布时间】:2013-06-16 19:07:07
【问题描述】:

我的应用中有一个全屏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

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

【问题讨论】:

  • 如果每个单元格都填充了集合视图的边界,为什么不直接使用 UIPageViewController 并将其 transitionStyle 设置为 UIPageViewControllerTransitionStyleScroll?它旨在为每页托管一个子视图控制器。

标签: ios uiviewcontroller uicollectionview


【解决方案1】:

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

【讨论】:

  • 我完全同意 Sergey 的观点:UIPageViewController 就是为这个任务创建的。
  • @Sergey Kuryanov,我处于同样的情况,但在 UIPageViewController 中面临内存问题,您可以提供任何帮助来解决内存问题。我正在使用 arc
  • 也许你试图同时保存太多的 VC。没有实际代码很难检测到问题。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 我现在正在做同样的事情(其他 vc 的边缘可见,应用商店搜索结果)。您遇到的任何其他问题或指针?
  • 我发现唯一有用的是让所有子视图控制器采用一个协议,该协议允许集合视图的控制器告诉他们何时他们在屏幕上和离开屏幕 - 在那里,你会做 viewDidAppear /消失的东西,否则不会被调用,因为视图只出现一次。
  • 很高兴知道。谢谢。
  • 你最终是否使用分页来强制他们到下一个项目?试图确定.pagingEnabled 是否最好是targetContentOffsetForProposedContentOffset。
  • 客户想要“甩动”滚动,所以我无法进行分页,必须实现我自己的捕捉。他们希望它有分页的感觉,但能够滚动查看多个项目。如果可以的话,使用分页会更简单。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    相关资源
    最近更新 更多