Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UICollectionView中的UIViewController_Ios_Uiviewcontroller_Uicollectionview - Fatal编程技术网

Ios UICollectionView中的UIViewController

Ios UICollectionView中的UIViewController,ios,uiviewcontroller,uicollectionview,Ios,Uiviewcontroller,Uicollectionview,我的应用程序中有一个全屏UICollectionView。它水平滚动,每个单元格填充集合视图的边界。集合视图由UIViewController管理 考虑到每个“页面”都相当复杂,每个页面本身由关联的UIViewController管理是有意义的。iOS 5支持视图控制器包含,因此在连接和分离视图时,子控制器应接收适当的生命周期方法(例如,视图将出现:,等等)。这对视图回收有多好 从页面“1”滚动到“2”,将创建一个新视图(因为在触摸过程中,两个视图可以同时出现在屏幕上)。从“2”页移动到“3”页

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

考虑到每个“页面”都相当复杂,每个页面本身由关联的
UIViewController
管理是有意义的。iOS 5支持视图控制器包含,因此在连接和分离视图时,子控制器应接收适当的生命周期方法(例如,
视图将出现:
,等等)。这对视图回收有多好

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

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

这感觉不对。但是,在这个例子中,我想不出正确的方法来正确地重用视图。我是否采取了完全错误的方法?

我不认为
UICollectionView
是您完成任务的最佳选择。
如前所述:您可以使用
UIPageViewController

另一个选项是将
UIScrollView
与3个子视图(上一个、当前、下一个)一起使用。您将能够轻松管理其位置和滚动视图偏移,以达到您想要的效果。

WWDC 2011对此进行了描述。您可以从那里获取源代码。

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

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

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

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


总之,不要重复使用细胞。这比保留旧的要贵。向下滚动百行表不同于滚动几个全屏视图。但是,考虑到您的屏幕是全屏的,滚动视图可能是更好的选择

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

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


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

如果每个单元格都填满了集合视图的边界,为什么不使用
UIPageViewController
并将其
transitionStyle
设置为
UIPageViewControllerTransitionStyleScroll
?它被设计为每页承载一个子视图控制器。我完全同意Sergey的观点:这项任务就是UIPageViewController创建的目的。@Sergey Kuryanov,我也处于同样的情况,但UIPageViewController中面临内存问题,你能为解决内存问题提供的任何帮助。我正在使用Arc,也许你试图同时节省太多的VC。如果没有实际的代码,很难发现问题。我现在正在做完全相同的事情(其他vc的边缘是可见的,应用商店搜索结果也是如此)。你遇到过其他问题或指针吗?我发现唯一有用的是让所有的子视图控制器都采用一种协议,允许集合视图的控制器在它们在屏幕上和屏幕下移动时告诉它们-在那里,你会做ViewDidAspect/Englishe之类的事情,否则不会被调用,因为视图只出现过一次。很高兴知道。谢谢。你是否使用分页来强制他们进入下一个项目?试图确定
.paginEnabled
是否是
targetContentOffsetForProposedContentOffset
中最好的一个。客户想“甩”滚动,所以我无法进行分页,必须实现我自己的快照。他们想让它看起来像分页,但是能够滚动浏览多个项目。如果可以,使用分页,它会简单得多。