AsyncCollections 0.0.1

AsyncCollections 0.0.1

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2014年12月

Martin Fernandez维护。



AsyncCollections可以帮助您在后台使用CoreGraphics渲染位图,以用于集合/表格视图的单元格。

这里使用的方法在Apple的WWDC中展示过。我认为封装此代码以便重复使用会很有帮助。

使用方法

首先,我们需要了解哪些组件在渲染和显示单元格的过程中进行交互。

如果您想要显示一个UITableView,您需要子类化LVAsyncTableViewController;另一方面,如果您使用的是UICollectionView,则需要子类化LVAsyncCollectionViewController。这些控制器将是UITableViewUICollectionView的代理和数据源。

在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;
}

最后,我们需要设置LVAsyncTableViewControllerDelegateLVAsyncCollectionViewControllerDelegate。此协议将提供显示渲染所需的信息。检查示例项目中的LVRedSquaresViewControllerLVBlueSquaresViewController以更好地了解其工作原理。

对于这个例子,我们将假设您正在尝试显示一个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是一个实现LVAsyncRenderUIView。我们使用完成块而不是简单地返回视图,以防您需要在准备好渲染视图之前处理某些异步操作(例如获取图片)。

如果您实现cellForItem或cellForRow,需要调用super以检索适当的单元格,不要使用队列方法。

内部机制

LVAsyncTableViewControllerLVAsyncCollectionViewController拥有一个NSOperationQueue,在其中有绘制代码执行。

之前的渲染已缓存,如果单元格当前未显示在屏幕上,将取消绘制操作。

示例

运行示例项目:首先克隆仓库,然后从示例目录运行 pod install

安装

作者

Martin F,[email protected]

许可证

AsyncCollections 规模许可下可用。有关更多信息,请参阅 LICENSE 文件。