UICollectionViewCell 中的 UiviewControllers

UiviewControllers inside UICollectionViewCell

我在 UIViewController 中有一个 UICollectionView。 collectionView 包含故事板中 8 个视图控制器标识符的数组。 数组中的每个视图控制器都继承自持有 collectionView.

的 UIViewController

代码如下:

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return _contentPageRestorationIDs.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];

BaseContentViewController *contentViewController = (BaseContentViewController *)[self.storyboard instantiateViewControllerWithIdentifier:self.contentPageRestorationIDs[indexPath.row]];

// Set any data needed by the VC here
contentViewController.rootViewController = self;
contentViewController.view.frame = cell.bounds;
[cell addSubview:contentViewController.view];

return cell;
}

所以我的问题是我的 collection 视图滑动性能真的很慢。 我怎样才能提高 UICollectionView 的性能? 当我的视图控制器不显示时,单元格内的视图控制器是 "killed" 吗?

编辑:

根据此处的建议,我已将我的数组更改为包含视图控制器而不是标识符 nsstring。

在 ViewDidLoad 中:

_collectionView.delegate=self;
_collectionView.dataSource=self;
PRzeroVC  *zeroVC    = [[PRzeroVC alloc]init];
PRoneVC   *oneVC     = [[PRoneVC alloc]init];
PRtwoVC   *twoVC     = [[PRtwoVC alloc]init];
PRthreeVC *threeVC   = [[PRthreeVC alloc]init];
PRfourVC  *fourVC    = [[PRfourVC alloc]init];
PRfiveVC  *fiveVC    = [[PRfiveVC alloc]init];

_base           = [[BaseContentViewController alloc]init];

_pages = [[NSArray alloc]initWithObjects:zeroVC,oneVC,twoVC,threeVC,fourVC,fiveVC, nil];

[_collectionView reloadData];



- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = (UICollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];

cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
_base = (BaseContentViewController *)_pages[indexPath.row];

_base.rootViewController = self;
_base.view.frame = cell.bounds;
[cell addSubview:_base.view];

return cell;
}

我的单元格没有显示视图知道为什么吗?

来自instantiateViewControllerWithIdentifier:-

的文档

This method creates a new instance of the specified view controller each time you call it

您最好存储一个 UIViewController 数组,以便可以重复使用它们,而不是存储 ID 并在每次调用 tableView:cellForItemAtIndexPath: 时实例化一个新的视图控制器。

此外,由于 UICollectionViewCell 被重复使用,因此每次调用 tableView:cellForItemAtIndexPath: 时都继续向单元格添加子视图是不明智的。相反,请考虑使用 mainView 属性 创建您自己的 UICollectionViewCell 子类。在设置新的框架(或添加布局约束)并将其添加为子视图之前,您可以覆盖 setMainView: 以从其父视图中删除旧的 mainView。

您还应该实施适当的方法 UIViewController containment

通过使用队列保留和重用一定数量的实例,我能够获得包含每个子视图控制器的单元格集合的 smooth-scrolling 性能。

GitHub列出了一些重用队列的实现;而且,在对几乎每一个进行相当彻底的审查之后,我可以自信地推荐这个:

https://github.com/acoomans/ACReuseQueue

根据自述文件: 重用队列是一种在对象分配和初始化为 time-consuming.

时快速重用对象的方法

您的视图未显示的原因是因为您没有从单元格子类中实例化子视图控制器,也没有从 cellForItemAtIndexPath 中添加视图。它是关于范围的,而你已经倒退了。

此处提供了向单元格添加子视图控制器的完美说明集:

http://khanlou.com/2015/04/view-controllers-in-cells/

更新 Swift(在集合视图的单元格中添加视图控制器)

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
    let cellContentVC = self.storyboard?.instantiateViewController(withIdentifier: screens[indexPath.row])
    cellContentVC?.view.frame = cell.bounds
    cell.addSubview(cellContentVC!.view)

    return cell