AnsycDisplayKit是關(guān)注的人比較少的庫(kù)之一苛蒲,這是因?yàn)檫@是個(gè)很重量級(jí)的庫(kù)卤橄,它基本重寫了UIKit,使用它基本上就等同于放棄原來(lái)的UIView和UILayer的方案臂外,還有個(gè)原因是很少有界面復(fù)雜到像Facebook那樣對(duì)體驗(yàn)要求那么高窟扑。但這些問(wèn)題都不影響我們探究它內(nèi)部的機(jī)制,畢竟這是個(gè)Facebook內(nèi)部使用的庫(kù)漏健。
AnsycDisplayKit 的下載地址 https://github.com/facebookarchive/AsyncDisplayKit
正如github上所說(shuō)辜膝,AsyncDisplayKit已經(jīng)重新命名為Texture ,究其原因筆者猜測(cè)是因?yàn)樽髡撸⊿cott Goodson)的離職漾肮。他曾經(jīng)就職于Facebook以及Instagram等公司厂抖,并在這里大致介紹了AsyncDisplayKit 的概況 :
Scott Goodson - Behind AsyncDisplayKit
這個(gè)庫(kù)太龐大了,以至于我們不可能在一篇文章中描述完全克懊,因此忱辅,筆者會(huì)做個(gè)系列博客和大家討論這個(gè)庫(kù)。今天我們講第1篇:AnsycDisplayKit概述谭溉。
git clone AnsycDisplayKit的代碼后我們進(jìn)入example目錄墙懂,可以看到如下這么多目錄
我們選中ASViewController并打開(kāi),然后在該目錄下pod update完成后即可運(yùn)行運(yùn)行程序扮念,截圖如下:
我們選中其中的任何一個(gè)(這里選中第一個(gè))可以發(fā)現(xiàn):
下面我們針對(duì)上面的兩張圖一一分析损搬。
第一張圖是一個(gè)tableview列表頁(yè)(對(duì)應(yīng)的Controller是ViewController),第二章是collectionview列表頁(yè)(對(duì)應(yīng)的Controller是DetailViewController)。
由代碼
@interface ViewController : ASViewController<ASTableNode *>
@end
可知巧勤,ViewController繼承自ASViewController嵌灰。
當(dāng)然,從代碼
@interface ASViewController<__covariant DisplayNodeType : ASDisplayNode *> : UIViewController <ASVisibilityDepth>
@end
顯而易見(jiàn)颅悉,ASViewController是UIViewController的一個(gè)子類沽瞭。
在ViewController的初始化中,我們看到
- (instancetype)init
{
self = [super initWithNode:[ASTableNode new]];
if (self == nil) { return self; }
return self;
}
因此剩瓶,這里在ViewController的創(chuàng)建中驹溃,新建了一個(gè)ASTableNode。我們繼續(xù)看ASTableNode的代碼
@interface ASTableNode : ASDisplayNode <ASRangeControllerUpdateRangeProtocol>
@property (strong, nonatomic, readonly) ASTableView *view;
@end
顯而易見(jiàn)延曙,Node與View的關(guān)系:
其中豌鹤,view是作為node的一個(gè)屬性存在,后面我們會(huì)發(fā)現(xiàn)枝缔,所有的針對(duì)UIKit層的操作傍药,后面都是只針對(duì)ASNode的操作。那從view如何獲取node呢魂仍,這里先不做說(shuō)明拐辽,后面的文章會(huì)有更加細(xì)致的說(shuō)明。
總所周知擦酌,View和Layer是有很大聯(lián)系的俱诸,layer層負(fù)責(zé)UI的繪制,View負(fù)責(zé)事件的處理赊舶。所以我們不難得出如下的圖:
到這里睁搭,AsyncDisplayKit 的中心思想已經(jīng)介紹完了。我們不難得出笼平,在ViewController中如下代碼的大概意思
- (NSInteger)tableNode:(ASTableNode *)tableNode numberOfRowsInSection:(NSInteger)section
{
}
- (ASCellNodeBlock)tableNode:(ASTableNode *)tableNode nodeBlockForRowAtIndexPath:(NSIndexPath *)indexPath
{
}
- (void)tableNode:(ASTableNode *)tableNode didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
}
第一個(gè)的意思應(yīng)該是cell的個(gè)數(shù)
第二個(gè)是每個(gè)cell的樣式
第三個(gè)是點(diǎn)擊cell的處理
那以前的UITableView的代理方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(nonnull NSIndexPath *)indexPath
{
}
哪里去了呢园骆,別急,請(qǐng)聽(tīng)下回分解寓调。