HTRasterView 1.2.9

HTRasterView 1.2.9

测试已测试
Lang语言 Obj-CObjective C
许可 MIT
发布上次发布2014年12月

未声明的维护者 维护。



  • 作者:
  • Jacob Jennings

概述

HTRasterView 是一个基于状态的缓存渲染组件的渲染系统。相对于 Core Animation 的渲染,具有以下优点

  • 对于每个独特的状态,您只需绘制一次组件
  • 支持用于非嵌套用例的异步绘制
  • 智能缓存的组件嵌套
  • 支持边缘填充(可调整大小 UIImage)的组件在其可能的最小框架内进行渲染(性能提升)
  • 将 GPU 重度操作(如 alpha 合成和遮罩)预计算到单个图像中
  • 手动在光栅化版本和实际组件之间切换

请参阅相关的博客文章:http://engineering.hoteltonight.com/asynchronous-state-aware-component-rasterizat

安装

这个库依赖于 MindSnacks 的 Javier Soto 的 MSCachedAsyncViewDrawing 类。推荐安装方法是 cocoapods,它会自动处理此依赖项。将以下行添加到您的 Podfile

pod 'HTRasterView'

https://cocoapods.org.cn

用法

首先,实现 HTRasterizableView 协议。在演示项目中提供了一个简单的示例(HTExampleRasterizableComponent)。唯一必需的方法是

- (NSArray *)keyPathsThatAffectState;

这个方法用于两个目的

  • 键值观察指定的键路径以触发图像再生
  • 生成组件状态的哈希值

初始化 HTStateAwareRasterImageView,并将 rasterizableView 属性设置为您的 HTRasterizableView,如下面的演示项目代码片段所示

_rasterizableComponent = [[HTExampleRasterizableComponent alloc] init];
_rasterView = [[HTRasterView alloc] init];
_rasterView.rasterizableView = _rasterizableComponent;
_rasterView.delegate = self;
[self addSubview:_rasterView];

如果您的组件可以利用 UIImage 边缘(固定大小的角落和可扩展的中心),则在 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;

演示项目

演示项目有四个标签页

  • 一个利用 HTRasterView 的 tableview
  • 一个显示缓存键、实际大小和单元格高度的缓存的 tableview
  • 在不进行光栅化的情况下使用相同组件的 tableview
  • 启用 Core Animation 光栅化的 tableview,使用相同的组件

HotelTonight HotelTonight

限制

散列

用于定义组件状态的缓存键由NSObject+HTPropertyHash类生成。确保hash方法生成一个与属性状态唯一对应的字符串,但不要过于独特,包括诸如指针值等。在那个类别中对CGColorRef的例外是因为我们只想描述RGBA值,而不包括指针值加上RGBA值。

使用它?喜欢/不喜欢它?

给作者 @jakejennings 发推文,并查看HotelTonight的 engineering博客:http://engineering.hoteltonight.com

还有,看看HotelTonight的其它iOS开源项目