1 使用 Hit Test Slop 来扩大某个节点的点击区间

个人觉得这个功能还是十分便捷的,有时候设计很经常又要求图片显示区域小,但是点击区域又要很大,这时候就可以使用Hit Test Slop来完成。
hitTestSlop属性是一个UIEdgeInsets类型,可以通过它来扩大或者缩小可点击区域。值得注意的是这个属性在ASDisplayNode类中,所以任何的节点都可以使用它来扩展点击区域。

Hit Test的可视化调试工具:

http://texturegroup.org/docs/debug-tool-hit-test-visualization

使用方法:

在AppDelegate.m 文件中导入AsyncDisplayKit+Debug.h 在 didFinishLaunchingWithOptions 方法里面添加

[ASControlNode setEnableHitTestDebug:YES]

需要注意的是上面这个调用必须在所有的ASControlNodes初始化之前。

2 提前批量获取

在默认情况下,在用户滚动列表的时候,当到达数据还没到达界面上的时候可以提前批量获取数据。如果需要提前获取可以指定leadingScreensForBatching

tableNode.view.leadingScreensForBatching = 3.0; 

指定leadingScreensForBatching 后我们滚动列表,一旦列表到达需要预加载的区域,就会调用shouldBatchFetchForTableNode方法,这个方法可以决定是否需要预先加载数据。

- (BOOL)shouldBatchFetchForTableNode:(ASTableNode *)tableNode {
if (_weNeedMoreContent) {
return YES;
}
return NO;
}

如果shouldBatchFetchForTableNode返回YES 那么就会通过tableNode:willBeginBatchFetchWithContext 来获取数据。注意这个方法是在后台调用的,如果我们需要处理一些只有在主线程才能执行的动作那么需要切换到主线程。

- (void)tableNode:(ASTableNode *)tableNode willBeginBatchFetchWithContext:(ASBatchContext *)context  {
// 从远程网络或者本地获取数据
NSArray *newPhotos = [SomeSource getNewPhotos];

// 将数据插入table
[self insertNewRowsInTableNode:newPhotos];

// 决定是否还需要继续获取数据
_stillDataToFetch = ...;

// 结束批量获取
[context completeBatchFetching:YES];
}
3 图片修改Block

imageModificationBlock 会在图片显示到ASImageNode之前对图片进行一些预处理,使用imageModificationBlock可以很方便得添加图片特效,添加圆角,边界或者其他处理。这是相当方便的功能。

4 占位图

任何一个ASDisplayNode子类都可以重写-placeholderImage方法来提供一个占位图,这个占位图将会等到节点的内容完全加载后消失。要使用占位图,必须设置placeholderEnabled属性为YES,还可以设置placeholderFadeDuration 来指定占位图消失的过渡时间。同时还需要注意的是placeholderImage是在后台线程中调用的所以必须保证它是线程安全的,所以我们在加载图片的时候可以使用-[UIImage imageWithContentsOfFile:] 但是不能使用-[UIImage imageNamed:].因为后者是线程不安全的。

除了placeholderImage ASNetworkImageNode 节点也有对应的占位图,我们可以使用defaultImage来指定一个图片,当URL为空或者给定的URL加载失败的时候就会显示这个默认图。

5 视图与图层之间的切换

视图和图层是两个不同量级的组件,我们一般会在不需要触摸处理的情况下使用图层,但是在开发中我们还是会默认使用视图,因为需求不断改变的,现在不需要触摸处理不代表以后不需要触摸处理,一旦需要处理触摸事件的时候估计就傻眼了,因为在UIKit中从视图切换到图层是十分费时的,这种事情遇到过才知道这个过程的痛苦,如果使用Texture 就不存在这个问题,在Texture中将整个子树从视图转换为图层非常简单,只需要下面一行代码就可以搞定:

rootNode.isLayerBacked = YES;
6 将子树光栅化

将整个视图层次结构转化为单个视图层可以提高性能,在Texture中值需要下面一行代码,就可以将从该点开始的整个节点层次结构呈现为一个层

[rootNode enableSubtreeRasterization];
Contents
  1. 1. 1 使用 Hit Test Slop 来扩大某个节点的点击区间
  2. 2. 2 提前批量获取
  3. 3. 3 图片修改Block
  4. 4. 4 占位图
  5. 5. 5 视图与图层之间的切换
  6. 6. 6 将子树光栅化