AsyncCollections可以帮助您在后台使用CoreGraphics渲染位图,以用于集合/表格视图的单元格。
这里使用的方法在Apple的WWDC中展示过。我认为封装此代码以便重复使用会很有帮助。
首先,我们需要了解哪些组件在渲染和显示单元格的过程中进行交互。
如果您想要显示一个UITableView
,您需要子类化LVAsyncTableViewController
;另一方面,如果您使用的是UICollectionView
,则需要子类化LVAsyncCollectionViewController
。这些控制器将是UITableView
或UICollectionView
的代理和数据源。
在AsyncCollections中,您不使用自定义单元格,我们提供一个具有UIImageView的单元格,这是我们将插入背景渲染图像的地方。您需要在您的期望视图中实现@protocol LVAsyncRender
。这个小协议用于请求视图绘制自身以及确定它是否已经被绘制。
在- (UIImage *)renderWithSize:(CGSize)size;
中放置您的CoreGraphics代码,例如
- (UIImage *)renderWithSize:(CGSize)size
{
if (_render != nil)
return _render;
UIGraphicsBeginImageContextWithOptions(size, YES, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClearRect(context, CGRectMake(0, 0, size.width, size.height));
CGRect middleRect = CGRectMake(size.width / 2, size.height / 3, 20, 20);
[[UIColor redColor] setFill];
CGContextFillRect(context, CGRectMake(0, 0, size.width, size.height));
_render = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return _render;
}
最后,我们需要设置LVAsyncTableViewControllerDelegate
或LVAsyncCollectionViewControllerDelegate
。此协议将提供显示渲染所需的信息。检查示例项目中的LVRedSquaresViewController
和LVBlueSquaresViewController
以更好地了解其工作原理。
对于这个例子,我们将假设您正在尝试显示一个UICollectionView。
- (NSString *)asyncCollectionController:(LVAsyncCollectionViewController *)asyncCollectionController idForItemAtIndexPath:(NSIndexPath *)indexPath
。您需要为数据源中的每个项目提供一个标识符。这将用于内部缓存目的。
另一个重要的代理调用是
-(void)asyncCollectionController:(LVAsyncCollectionViewController *)asyncCollectionController prepareRenderForItemAtIndexPath:(NSIndexPath *)indexPath withCompletion:(void (^)(id<LVAsyncRender>))completion
{
LVBlueSquareView *bView = [[LVBlueSquareView alloc] init];
completion(bView);
}
在这种情况下,LVBlueSquareView
是一个实现LVAsyncRender
的UIView
。我们使用完成块而不是简单地返回视图,以防您需要在准备好渲染视图之前处理某些异步操作(例如获取图片)。
如果您实现cellForItem或cellForRow,需要调用super以检索适当的单元格,不要使用队列方法。
LVAsyncTableViewController
和LVAsyncCollectionViewController
拥有一个NSOperationQueue,在其中有绘制代码执行。
之前的渲染已缓存,如果单元格当前未显示在屏幕上,将取消绘制操作。
运行示例项目:首先克隆仓库,然后从示例目录运行 pod install
。
Martin F,[email protected]
AsyncCollections 规模许可下可用。有关更多信息,请参阅 LICENSE 文件。