iOS Texture<AsyncDisplayKit> Subclassing

Subclassing

创建子类时最重要的区别是您是编写ASDKViewController还是ASDisplayNode。这听起来很明显,但由于其中一些差异是微妙的,所以记住这一点很重要。

ASDisplayNode

虽然子类化node类似于编写UIView子类,但要遵循一些准则,以确保充分利用框架的潜力,并确保node的行为符合预期。

-init

使用nodeBlocks时,在后台线程上调用此方法。但是,由于在-init完成之前没有其他方法可以运行,因此不必在该方法中使用锁。

要记住的最重要的一点是init方法必须能够在任何队列上被调用。最重要的是,你不应该初始化任何一个对象。node.layer.Xnode.view.X)或在初始值设定项中添加任何手势识别器。相反,做这些事情在-didLoad

-didLoad

这个方法在概念上类似于UIViewController的-viewDidLoad方法;它只调用一次,是加载后台view的地方。它保证在主线程上被调用,并且是执行任何UIKit操作(例如添加手势识别器、触摸view/层、初始化UIKit对象)的适当位置。

-layoutSpecThatFits:

此方法定义布局并在后台线程上执行繁重的计算。此方法用于构建布局规范对象,该对象将生成nodesize以及所有子nodesizeposition。这是你将把你的大部分布局代码。

创建的layout spec对象是可延展的,直到它在此方法中返回为止。在这一点之后,它将是不变的。记住不要缓存布局规范供以后使用,而是在必要时重新创建它们。

因为它是在后台线程上运行的,所以不应该设置任何node.layer或者node.layer这里的属性。另外,除非您知道自己在做什么,否则不要在此方法中创建任何node。此外,与其他方法重写不同,不必以对super的调用开始此方法。
-layout

在这个方法中对super的调用是应用layoutSpec结果的地方;在这个方法调用super之后,layout spec将被计算出来,所有子node都将被测量和定位。

-layout在概念上类似于UIViewController-viewWillLayoutSubviews。这是更改隐藏属性、根据需要设置基于view的属性(不是可布局属性)或设置背景颜色的好地方。您可以在-layoutSpecThatFits:设置背景色,但可能存在计时问题。如果您碰巧在使用任何UIViews,可以在这里设置它们的frame。但是,您始终可以使用-initWithViewBlock:创建一个node包装器,然后在其他地方的后台线程上调整它的大小。

此方法在主线程上调用。但是,如果您使用的是布局规范,您不应该过于依赖此方法,因为最好在主线程之外进行布局。不到十分之一的子类需要这个。

layout的一个很好的用法是用于特定的情况,在这种情况下,您希望子node的大小与您的实际大小相同。 当你想要一个collectionNode占据全屏时。布局规范不支持这种情况,通常最容易在这种方法中使用单行手动设置frame

subnode.frame = self.bounds;

如果您希望在ASDKViewController中获得相同的效果,那么可以在-viewWillLayoutSubviews中执行相同的操作,除非您的nodeinitWithNode中的node,在这种情况下,它将自动执行此操作。

ASDKViewController
ASDKViewController是一个常规的UIViewController子类,具有管理节点的特殊功能。因为它是一个UIViewController子类,所以所有方法都是在主线程上调用的(您应该始终在主线程上创建一个ASDKViewController)。

-init

此方法在ASDKViewController生命周期的最初调用一次。与UIViewController初始化一样,最好不要访问self.view或者self.node.view在该方法中,因为它将强制提前创建view。相反,在-viewDidLoad中执行任何view访问。

ASDKViewController的指定初始值设定项为initWithNode:。典型的初始值设定项看起来像下面的代码。在调用super之前,请注意如何创建ASDKViewController的节点。ASDKViewController管理节点的方式与UIViewController管理view的方式类似,但初始化略有不同。

- (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

我们建议您不要使用此方法,因为它与-viewdiload相比没有特别的优势,并且有一些缺点。但是,只要不设置self.view属性设置为其他值。调用[super loadView]会为你将其设置为node.view

-viewDidLoad

此方法在ASDKViewController的生命周期中调用一次,即在加载view之后立即调用。这是您应该访问节点view的最早时间。这是一个很好的地方,可以放置任何只运行一次并且需要访问view/layer的设置代码,例如添加一个手势识别器。

布局代码永远不应该放在这个方法中,因为当几何图形发生变化时,它将不会被再次调用。注意,对于UIViewController也是如此;将布局代码放在该方法中是不好的做法,即使您当前不希望几何体发生更改。

-viewWillLayoutSubviews

此方法与节点的-layout方法在同一时间调用,并且在ASDKViewController的生命周期中可以多次调用;每当ASDKViewController的节点边界发生更改(包括旋转、拆分屏幕、,键盘显示)以及层次结构发生更改时(子级正在添加、删除或更改大小)。

为了保持一致性,最好将所有布局代码都放在这个方法中。因为它的调用不是很频繁,所以即使不直接依赖于大小的代码也属于这里。

-viewWillAppear: / -viewDidDisappear:

这些方法在ASDKViewController的节点出现在屏幕上之前(该节点可见的最早时间)以及从view层次结构中移除之后(它不再可见的最早时间)调用这些方法。这些方法提供了一个很好的机会来启动或停止与控制器的演示或解除相关的动画。这也是一个记录用户操作的好地方。

尽管这些方法可能被多次调用并且几何信息可用,但它们并不是针对所有几何图形更改而调用的,因此不应用于核心布局代码(超出特定动画所需的设置)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值