HTStateAwareRasterImageView 是一个基于状态的缓存渲染组件的栅格化系统。相比 Core Animation 的栅格化,其优点是每个独特的状态只绘制一次组件。也支持异步绘制。相关博客文章在 http://engineering.hoteltonight.com/asynchronous-state-aware-component-rasterizat
该库依赖于 MindSnacks 的 Javier Soto 的 MSCachedAsyncViewDrawing 类。推荐的安装方法是 Cocoapods,它将自动处理这个依赖。将以下行添加到您的 Podfile 中
pod 'HTStateAwareRasterImageView'
首先,实现 HTRasterizableView 协议。在演示项目中提供了一个简单的示例(HTExampleRasterizableComponent)。唯一的必需方法是
- (NSArray *)keyPathsThatAffectState;
这用于以下两个目的
初始化 HTStateAwareRasterImageView 并将 rasterizableView 属性设置为您的 HTRasterizableView,例如演示项目中的以下代码片段
_rasterizableComponent = [[HTExampleRasterizableComponent alloc] init];
_stateAwareRasterImageView = [[HTStateAwareRasterImageView alloc] init];
_stateAwareRasterImageView.rasterizableView = _rasterizableComponent;
_stateAwareRasterImageView.delegate = self;
[self addSubview:_stateAwareRasterImageView];
如果您的组件可以利用 UIImage caps(固定大小的角落和可拉伸的中心),这些两个方法在 HTRasterizableView 协议上是可选的
- (UIEdgeInsets)capEdgeInsets;
- (BOOL)useMinimumFrameForCaps;
您可以指定是否要在主线程上同步绘制
@property (nonatomic, assign) BOOL drawsOnMainThread;
您还可以禁用键值观察,如果希望手动再生图像(用于预渲染资源)
@property (nonatomic, assign) BOOL kvoEnabled;
// For prerendering only
- (void)regenerateImage:(HTSARIVVoidBlock)complete;
还提供了一个代理属性,以便在再生图像时通知您,当它获取新的图像时
@property (atomic, assign) id<HTStateAwareRasterImageViewDelegate> delegate;
对于调试目的,缓存键可以通过此方法获取。
- (NSString *)cacheKey;
演示项目有四个标签页
用于定义组件状态缓存的密钥由NSObject+HTPropertyHash类别生成。确保哈希方法生成的字符串是您属性状态的唯一标识,但不能过分独特,包括指针值等。在那个类别中对CGColorRef的例外处理是因为我们只想描述RGBA值,而不是指针值加上RGBA值。
给作者 @jakejennings 发推文,并查看HotelTonight的工程博客:http://engineering.hoteltonight.com
另外,查看HotelTonight的其他iOS开源项目