子类

ASDisplayNode

虽然使用类似于UIView 但是我们需要遵循一些使用规则 帮助更好的使用并按照预期运行

-init

当使用nodeBlocks时,此方法在后台线程调用。在init方法完成之前没有其他方法可以运行,因此我们无需在此方法中锁定

需要注意,-init方法能在任何对队列调用。所以我们不应该在初始化过程中初始化任何UIKit对象,调用任何node的view或layer等有关的操作,或者添加任何手势识别器。这些过程可以在-didLoad方法中

-didLoad

这个方法当视图在后台加载完成后执行一次。保证在主线程被调用,因此是我们运行任何UIKit事务的适当位置(例如添加手势识别器,触摸视图/图层,初始化UIKit对象)

-layoutSpecThatFits:

这个方法在后台执行繁重的定义布局的计算。这是我们声明、创建和修改ASLayoutSepec布局描述对象的地方,该对象描述节点的size以及子节点的position和size。这是我们放置大部分布局代码的地方

ASLayoutSpec 对象直到在此方法中返回前是可变的。 在这之后,这个对象将不可改变,需要注意的是你不需要缓存 ASLayoutSpec 对象以备后用,我们建议你在必要时重新创建布局描述。

因为此方法在后台运行,因此不应该在此方法中设置node.view或者node.layer属性。此外,除非您知道自己在做什么,否则不应该再次方法中创建任何节点。与其它方法重写不同,不必在方法开始时调用super方法

-layout

在此方法中调用super,将会使用layoutSpec对象计算布局,所有子节点都将计算其size和position。

layout在概念上类似UIViewController-viewWillLayoutSubviews。可以在这个方法中,更改hidden属性、修改View属性(不是布局属性)、或者背景颜色。假如正好使用UIView,可以再这个方法中修改其frame。然而,我们可以用initWithViewBlock:然后在后台线程的任何地方,调整其大小。

这个方法在主线程上调用。但是最后不要过多使用这个方法,我们更应该在主线程以外做布局

使用-layout的一个重要用途是你需要子节点的size是精确的。例如:当你想要一个collectionNode占满屏幕时,这种情况是不被布局规范所允许的,我们通常手动在方法中添加subnode.frame = self.bounds;

ASViewController

ASViewControllerUIViewController的子类,用来管理nodes。因为是一个UIViewController,所以所有方法都在主线程调用(ASViewController也应该在主线程创建)。

-init

在生命周期的最开始调用一次。与UIViewController相同不要再次方法中访问self.view或者self.node.view,因而为它会强制视图提前创建。可以在viewDidLoad方法中执行任何视图访问

ASViewController 指定的构造器是initWithNode:方法,在调用super方法前初始化node。

- (instancetype)init
{
  _pagerNode = [[ASPagerNode alloc] init];
  self = [super initWithNode:_pagerNode];
  
  // setup any instance variables or properties here
  if (self) {
    _pagerNode.dataSource = self;
    _pagerNode.delegate = self;
  }
  
  return self;
}

-loadView

不推荐使用此方法,因此相比较viewDidLoad只有缺点没有优点。然而,只要我们在此方法中不将self.view设置为其他值 也可以安全使用的。其super方法会将其UIViewController的view换为ASViewControllernode.view

-viewDidLoad

这方法在ASViewController的生命周期中,只会在loadView方法后,立即执行一次。此时最方便访问node.view。也可以执行需要访问view/layer的只执行一次的方法(例如添加手势)。

不适合在方法中放置布局视图的代码。因为界面重绘时,该方法也不会被再次调用。

-viewWillLayoutSubviews

与节点node的layout方法同时调用,在ASVC的生命周期中有可能会多次调用。当ASViewController的node边界发生变化(包括旋转、分屏、键盘)以及层次结构发生变化(包括node增加、删除、改变大小)时,都会调用

因为它不经常调用,但是调用及代表页面需要重绘,因此所有布局代码最好放到这个方法中,即使不直接依赖size的UI代码。
为保持一致性,通常将所有布局代码放置在此处。

-viewWillAppear: / -viewDidDisappear:

方法在ASViewController的node出现在屏幕之前 和 从视图层次中删除之后调用。通常在方法中开始或者停止动画,或者记录用户操作。