AsyncDisplayKit 学习记录

秉承拿来主义,在参考了多篇文档的过程中,摘录一些作为记录。如有侵权,联系立删。

容器节点

ASDK UIKit
ASViewController UIViewController
ASTableNode UITableView
ASCollectionNode UICollectionView
ASPagerNode UICollectionView
  • ASViewController. UIViewController 类型的容器,管理子节点
  • ASCollectionNode. UICollectionView 类型的容器,管理使用ASCellNode
  • ASTableNode. UITableView 类型的容器,管理使用ASCellNode
  • ASPagerNode. 一种特殊的ASCollectionNode 可以当做 UIPageViewController类型

控件

ASDK UIKit
ASDisplayNode UIView
ASCellNode UITableViewCell/UICollectionViewCell
ASTextNode UILabel
ASImageNode UIImageView
ASNetworkImageNode UIImageView
ASVideoNode AVPlayerLayer
ASControlNode UIControl
ASScrollNode UIScrollView
ASControlNode UIControl
ASEditableTextNode UITextView
ASMultiplexImageNode UIImageView

子父类关系:

  • ASDisplayNode
    • ASCellNode
      • ASTextCellNode
    • ASCollectionNode
      • ASPagerNode
    • ASControlNode
      • ASButtonNode
      • ASImageNode
      • ASMapNode
      • ASMultiplexImageNode
      • ASNetworkImageNode
      • ASVideoNode
      • ASTextNode
    • ASEditableTextNode
    • ASScrollNode
    • ASTableNode
    • ASVideoPlayerNode

ASDisplayNode 作为最基本的节点
ASDisplayNode是最主要的UIView和CALayer的抽象对象,他初始化的时候拥有一个UIView,同时UIView在初始化的时候拥有一个CALayer

ASDisplayNode *node = [[ASDisplayNode alloc] init];
node.backgroundColor = [UIColor orangeColor];
node.bounds = CGRectMake(0, 0, 100, 100);

NSLog(@"Underlying view: %@", node.view);

ASDK布局都是基于 ASDK 组件的,所以当遇到要使用原生控件时,通过用 block 的方式包装一个原生组件再合适不过了,例如:
可以把一个UIView子类包装成一个ASDisplayNode子类

ASDisplayNode *node = [ASDisplayNode alloc] initWithViewBlock:^{
    SomeView *view = [[SomeView alloc] init];
    return view;
}];

Layout

AsyncDisplayKit的排版引擎是非常强大并且独特的,基于CSS FlexBox模型。

支持如下布局规则
ASWrapperLayoutSpec 填充布局规则

ASStackLayoutSpec 堆叠布局规则

ASInsetLayoutSpec 插入布局规则

ASOverlayLayoutSpec 覆盖布局规则

ASBackgroundLayoutSpec 背景布局规则

ASCenterLayoutSpec 中心布局规则

ASRatioLayoutSpec 比例布局规则

ASRelativeLayoutSpec 相对布局规则

ASAbsoluteLayoutSpec 绝对布局规则

,下面是所有的子类及其关系:

  • ASLayoutSpec
    • ASAbsoluteLayoutSpec // 绝对布局
    • ASBackgroundLayoutSpec // 背景布局
    • ASInsetLayoutSpec // 边距布局
    • ASOverlayLayoutSpec // 覆盖布局
    • ASRatioLayoutSpec // 比例布局
    • ASRelativeLayoutSpec // 顶点布局
      • ASCenterLayoutSpec // 居中布局
    • ASStackLayoutSpec // 盒子布局
    • ASWrapperLayoutSpec // 填充布局
      下面这个方法是布局方法,所以对视图进行布局需要重写这个方法。
- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize

ASStackLayoutSpec介绍

该说说 stack layout spec 了。你可以把它看成是一种和 UIStackView 类似的 layout spec,但它能够自动向后兼容,这确实太爽了。
Stacks 可以定义要么横向要么纵向,和其它 layout spec 一样,它可以把其它节点或 layout spec 作为子对象

    ASStackLayoutSpec *goodsImageContentStack = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal
                                                                                        spacing:10
                                                                                 justifyContent:ASStackLayoutJustifyContentStart
                                                                                     alignItems:ASStackLayoutAlignItemsStretch
                                                                                       children:@[typeTagAbsolute, contentStack]];

ASStackLayoutSpec
可以说这是最常用的类,而且相对于其他类来说在功能上是最接近于 AutoLayout
的。之所以称之为盒子布局是因为它和 CSS 中 Flexbox
很相似,不清楚 Flexbox
的可以先看下阮一峰的这篇博客
先看一个例子:

- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize{ 
self.childNodeA.style.preferredSize = CGSizeMake(100, 100); 
self.childNodeB.style.preferredSize = CGSizeMake(200, 200); 
ASStackLayoutSpec *stackLayout = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionVertical 
                                                                         spacing:12
                                                                  justifyContent:ASStackLayoutJustifyContentStart 
                                                                      alignItems:ASStackLayoutAlignItemsStart 
                                                                        children:@[self.childNodeA, self.childNodeB]];
 return stackLayout;
}

简单的说明下各个参数的作用:

  1. direction
    :主轴的方向,有两个可选值:
  • 纵向:ASStackLayoutDirectionVertical

  • 横向:ASStackLayoutDirectionHorizontal

  1. spacing
    : 主轴上视图排列的间距,比如有四个视图,那么它们之间的存在三个间距值都应该是spacing

  2. justifyContent
    : 主轴上的排列方式,有五个可选值:

  • ASStackLayoutJustifyContentStart 从前往后排列
  • ASStackLayoutJustifyContentCenter 居中排列
  • ASStackLayoutJustifyContentEnd 从后往前排列
  • ASStackLayoutJustifyContentSpaceBetween间隔排列,两端无间隔
  • ASStackLayoutJustifyContentSpaceAround 间隔排列,两端有间隔
  1. alignItems
    : 交叉轴上的排列方式,有五个可选值:
  • ASStackLayoutAlignItemsStart 从前往后排列

  • ASStackLayoutAlignItemsEnd 从后往前排列

  • ASStackLayoutAlignItemsCenter 居中排列

  • ASStackLayoutAlignItemsStretch 拉伸排列

  • ASStackLayoutAlignItemsBaselineFirst 以第一个文字元素基线排列(主轴是横向才可用)

  • ASStackLayoutAlignItemsBaselineLast 以最后一个文字元素基线排列(主轴是横向才可用)

  1. children
    : 包含的视图。数组内元素顺序同样代表着布局时排列的顺序,所以需要注意

主轴的方向设置尤为重要,如果主轴设置的是 ASStackLayoutDirectionVertical
, 那么 justifyContent
各个参数的意义就是:

  • ASStackLayoutJustifyContentStart 从上往下排列

  • ASStackLayoutJustifyContentCenter 居中排列

  • ASStackLayoutJustifyContentEnd 从下往上排列

  • ASStackLayoutJustifyContentSpaceBetween 间隔排列,两端无间隔

  • ASStackLayoutJustifyContentSpaceAround 间隔排列,两端有间隔

alignItems
就是:

  • ASStackLayoutAlignItemsStart 从左往右排列

  • ASStackLayoutAlignItemsEnd 从右往左排列

  • ASStackLayoutAlignItemsCenter 居中排列

  • ASStackLayoutAlignItemsStretch 拉伸排列

  • ASStackLayoutAlignItemsBaselineFirst 无效

  • ASStackLayoutAlignItemsBaselineLast 无效

参考:
新大陆:AsyncDisplayKit
AsyncDisplayKit官方文档个人翻译
AsyncDisplaykit2.0使用「复杂界面流畅性」
AsyncDisplayKit官方文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容