UICollectionView
用UIViewController
替代cells。
支持视图控制器封装!
要运行示例项目,首先克隆仓库,然后在 Example 目录中运行 pod install
#import <Voltron/Voltron.h>
使用 WMLCollectionView
替代 UICollectionView
,使用 WMLCollectionViewCell
替代 cells,显示视图控制器。
将 collectionView.containerViewController
设置为主持子视图控制器的视图控制器。
实现数据源方法
- (UIViewController *)collectionView:(WMLCollectionView *)collectionView controllerForIdentifier:(NSString *)identifier {
if ([identifier isEqualToString:@"Login"]) {
return [self.storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
} else if ([identifier isEqualToString:@"Profile"]) {
return [self.storyboard instantiateViewControllerWithIdentifier:@"UserProfileViewController"];
}
}
didEndDisplayingCell:
并传入 cell,这样给集合视图一个提示,它可以被回收。- (void)collectionView:(WMLCollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
[collectionView didEndDisplayingCell:cell];
}
WMLCollectionView
中同时托管常规cells和基于视图控制器的cells?是的。
collectionView:controllerForIdentifier:
被调用的频率?数据源方法仅在新视图控制器创建时被调用,当可能时,视图控制器就像常规cells一样被重用。
绝对不是。只有一次初始初始化,最好是放在加载视图控制器的viewDidLoad
中。
要使用数据配置视图控制器,请使用 -[WMLCollectionViewCell contentViewController]
视图控制器的生命周期得到了保持。当视图控制器即将显示时,会触发 viewWillAppear:
和 viewDidAppear:
。
一旦视图控制器从屏幕上消失,会触发 viewWillDisappear:
和 viewDidDisappear:
。
您应该记住,在性能关键的区域,当您尝试同时显示过多的 cells 时可能会受到影响。
在填充集合视图数据时,请三思而行。例如,当播放开场过渡时,可能最好延迟显示 200 个小的 cells。
为了实现平滑滚动,请尝试延迟控制器数据的填充。
从这个意义上说,测试项目只是为了展示如何使用API,但它显然不是一个典型的从性能角度的使用场景。
collectionView:didEndDisplayingCell:forItemAtIndexPath:
这么烦恼呢?该项目旨在符合App Store的要求,因此我想要仅使用公开API来实现。
collectionView:willDisplayCell:forItemAtIndexPath:
呢?该项目旨在与iOS 7兼容。遗憾的是,上述代理方法是iOS 8+所特有的。这也是为什么你必须使用自定义的WMLCollectionViewCell
来通知收集视图它即将被显示的原因。
伏尔甘项目受MIT许可协议保护。有关更多信息,请参阅LICENSE文件。
Sash Zats,[email protected]
嘛!