入门
Texture
的基本单位是node
。ASDisplayNode
是UIView
上的抽象,而UIView
又是CALayer
上的抽象。与只能在主线程上使用的视图不同,node
是线程安全的:您可以在后台线程上并行实例化和配置它们的整个层次结构。
为了保持用户界面的流畅和响应,你的应用程序应该以每秒60
帧的速度呈现——这是iOS
上的黄金标准。这意味着主线程有六十分之一秒的时间来推动每个帧。执行所有布局和绘图代码需要16
毫秒!而且由于系统开销,在导致帧丢失之前,代码的运行时间通常少于10
毫秒。
Texture
允许您将图像解码、文本大小和渲染以及其他昂贵的UI
操作从主线程中移出,以使主线程能够响应用户交互。Texture
也有其他的诀窍…但我们稍后再讨论。
Nodes
(节点)
如果您习惯于使用view
,那么您已经知道如何使用node
。大多数方法都有一个node
等价物,大多数UIView
和CALayer
属性也可用。在任何命名不一致的情况下(例如.clipsToBounds
vs.masksToBounds
),node
将默认为UIView
名称。唯一的例外是node
使用position
而不是center
。
当然,您始终可以通过node.view
或者node.layer
,确保在主线程上执行!
Texture
提供了各种各样的node
来替换您所使用的大多数UIKit
组件。大型应用已经能够完全使用Texture node
来编写用户界面。
Node Subclasses
Texture
提供以下node
。
与UIKit
组件相比,使用node
的一个关键优势是,所有node
都在主线程之外执行布局和显示,因此主线程可以立即响应用户交互事件。
Texture Node | 等同UIKit中 |
---|---|
ASDisplayNode | 代替UIKit的UIView根Texturenode,所有其他node都从该node继承。 |
ASCellNode | 代替UIKit的UITableViewCell和UICollectionViewCell ASCellNodes用于ASTableNode、ASCollectionNode和ASPagerNode。 |
ASScrollNode | 代替UIKit的UIScrollView 此node对于创建包含其他node的自定义可滚动区域非常有用。 |
ASEditableTextNode | 代替UIKit的UITextView |
ASTextNode | 代替UIKit的 UILabel |
ASImageNode ASNetworkImageNode ASMultiplexImageNode | 代替UIKit的UIImageView |
ASVideoNode | 代替UIKit AVPlayerLayer |
ASVideoPlayerNode | 代替UIKit的UIMoviePlayer |
ASControlNode | 代替UIKit的UIControl |
ASButtonNode | 代替UIKit 的ASButtonNode |
ASMapNode | 代替UIKit的MKMapView |
尽管与UIKit
组件有大致的等价性,但一般来说,Texture node
提供了更高级的功能和便利性。例如,ASNetworkImageNode
执行自动加载和缓存管理,甚至支持渐进式jpeg
和动画gif
。
AsyncDisplayKitOverview示例应用程序提供了上面列出的每个node
的基本实现。
node
继承层次结构
node
容器
将应用程序转换为使用Texture
时,一个常见的错误是将node
直接添加到现有view
层次结构中。这样做实际上可以保证node
在渲染时闪烁。
相反,您应该添加node
作为多个node
容器类之一的子node
。这些容器负责告诉包含的node
它们当前处于什么状态,以便可以加载数据并尽可能高效地呈现node
。您应该将这些类视为UIKit
和Texture
之间的集成点。
在node
容器中使用node
强烈建议在node
容器中使用Texture
的node
。Texture
提供以下node
容器。
对应关系表格
Texture Node Container | UIKit |
---|---|
ASCollectionNode | UICollectionView |
ASPagerNode | UIPageViewController |
ASTableNode | UITableView |
ASViewController | UIViewController |
ASNavigationController | UINavigationController 实现ASVisibility协议 |
ASTabBarController | UITabBarController 实现ASVisibility协议 |
每个node
容器的文档中都突出显示了示例代码和特定的示例项目。
使用node
容器有什么好处?
node
容器自动管理其node
的智能预加载。这意味着所有node
的布局测量、数据获取、解码和渲染都将异步完成。除了其他便利,这就是为什么建议在node
容器中使用node
的原因。
请注意,虽然可以直接使用node
(不使用Texturenode
容器),但除非添加其他调用,否则只有在它们出现在屏幕上时才会开始显示(就像UIKit
一样)。这可能导致性能下降和内容闪烁。
布局引擎
Texture
的布局引擎既是它最强大的功能之一,也是它最独特的功能之一。基于cssflexbox
模型,它提供了一种声明性的方法来指定自定义node
的大小及其子node
的布局。默认情况下,所有node
都是并发呈现的,异步测量和布局是通过为每个node
提供一个ASLayoutSpec
来执行的。
Texture
的布局引擎基于CSS
框模型。虽然框架的特性与UIKit
等价物(AutoLayout
)最不相似,但一旦你习惯了,它也是最有用的特性之一。经过足够的实践,您可能会更喜欢创建声明性布局而不是基于约束的方法。;]
参与这个系统的主要方法是在node
子类中实现-layoutSpecThatFits
:。在这里,您可以声明性地从内到外构建布局规范,返回包含其余部分的最终规范。
- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize
{
ASStackLayoutSpec *verticalStack = [ASStackLayoutSpec verticalStackLayoutSpec];
verticalStack.direction = ASStackLayoutDirectionVertical;
verticalStack.spacing = 4.0;
[verticalStack setChildren:_commentNodes];
return verticalStack;
}
虽然这个例子非常简单,但它让你了解了如何使用布局规范。例如,堆栈布局规范定义了一个node
布局,在该布局中,chlidren
将按照指定的方向和指定的间距相邻地布局。它与UIStackView
非常相似,但它还具有向后兼容性的优点。
ASLayoutable
布局规范的子级可以是类符合<ASLayoutable>
协议的任何对象。所有node以及所有布局规范都符合<ASLayoutable>
协议。这意味着您的布局可以构建在可组合的块中,直到您得到您想要的。
假设您想在已经设置的堆栈中添加8像素填充:
- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize
{
ASStackLayoutSpec *verticalStack = [ASStackLayoutSpec verticalStackLayoutSpec];
verticalStack.direction = ASStackLayoutDirectionVertical;
verticalStack.spacing = 4.0;
[verticalStack setChildren:_commentNodes];
UIEdgeInsets insets = UIEdgeInsetsMake(8, 8, 8, 8);
ASInsetLayoutSpec *insetSpec = [ASInsetLayoutSpec insetLayoutSpecWithInsets:insets
child:verticalStack];
return insetSpec;
}
您可以通过将该堆栈作为inset
布局规范的子级来轻松实现这一点。
高级开发人员功能
Texture
提供了UIKit
或Foundation
中无法找到的各种高级开发人员功能。我们的开发人员发现,Texture
可以简化他们的架构,并提高开发人员的开发速度。
(很快就会有完整的列表!)
向应用程序添加Texture
如果你是个Texture
新手,我们建议你看看我们的ASDKgram
示例应用程序。我们已经创建了一个方便的指南(即将推出!)一步一步的指导和一个后续的例子如何添加Texture
到一个应用程序。
使用安装方法
Texture 可以通过 CocoaPods .记得引入头文件:
#import <AsyncDisplayKit/AsyncDisplayKit.h>
CocoaPods
CocoaPods上有Texture。在Podfile中添加以下内容:
target 'MyApp' do
pod "Texture"
end
或者直接在GitHub上查找:
github "texturegroup/texture" "master"