【譯】AsyncDisplayKit的組件

節點容器

在容器中使用Nodes

AsyncDisplayKit有以下幾種 Container

ASDK Node Container UIKit Equivalent
ASCollectionNode 代替UIKit的 UICollectionView
ASPagerNode 代替UIKit的 UIPageViewController
ASTableNode 代替UIKit的 UITableView
ASViewController 代替UIKit的 UIViewController
ASNavigationControllerv 代替UIKit的 UINavigationController,遵循ASVisibility協議
ASTabBarController 代替UIKit的 UITabBarController,遵循ASVisibility協議

Node Container的優勢

Node Container可以自動地管理node的智能預加載,它會保證node的的布局計算、數據獲取、解碼和渲染會以異步的方式進行。

Node的子類

AsyncDisplayKit提供了以下幾種node

相對UIKit的組件來說 node 最大的改進就是將所有布局和顯示都放在子線程,因此主線程就能夠即時地響應各種事件。

ASDK Node UIKit Equivalent
ASDisplayNode 代替UIKit的 UIView ,其他的node都繼承于它
ASCellNode 代替UIKit的 UITableViewCellUICollectionViewCell,用在 ASTableNode , ASCollectionNodeASPagerNode
ASScrollNode 代替UIKit的 UIScrollView,這個 node 用在自定義滾動區域上非常有用
ASEditableTextNode 代替UIKit的 UITextView
ASTextNode 代替UIKit的 UILabel
ASImageNode 代替UIKit的 UIImage
ASNetworkImageNode
ASMultiplexImageNode
ASVideoNode 代替UIKit的 AVPlayerLayer
ASVideoPlayerNode 代替UIKit的 UIMoviePlayer
SControlNode 代替UIKit的 UIControl
ASButtonNode 代替UIKit的 UIButton
ASMapNode 代替UIKit的 MKMapView

AsyncDisplayKit 中的 node 相比UIKit中的組件更先進而且更方便。比如 ASNetworkImageNode 可以自動地加載和進行內存管理,而且還支持逐步加載Jpeg和動態gif圖片。

node 的層級結構如下

Node的層級結構

上圖中藍色高亮的node是對UIKit元素的封裝而成。比如 ASScrollNode 封裝自 UIScrollViewASCollectionNode 封裝自 UICollectionViewASMapNode 在實時地圖模式中就是 UIMapView 封裝。

基本重載方法

創建子類時,子類是 ASViewController 還是 ASDisplayNode 有很大的區別。這感覺上是顯而易見的,但是有的區別是很微妙的,所有也需要特別注意。

ASDisplayNode

如果你使用的 node 組件類型于 UIView 的子控件,就必須注意下面幾條準則以確保你充分發揮了這個框架的潛力, node 也能很好的顯示。

-init

當使用 nodeBlock 的時候這個方法是在子線程進行的。但是,如何 -init 沒有運行完,其他方法就無法運行,所以這個方法永遠不要上鎖。

最重要的是你的 init 方法一定要能在任何隊列中調用。尤其是不要在初始化的時候初始化任何 UIKit 控件、點擊 nodeview 或者 layer 或者添加任何手勢。這些事情應該放在 -didLoad 中。

-didLoad

這個方法在概念上類似于 UIViewController-viewDidLoad 方法,它代表著后臺的 view 已經被加載完成了。要確保它是在主線程中執行的,在這個方法中很適合處理 UIKit 的各種操作(比如添加手勢,點擊 view 或者 layer,初始化 UIKit 組件)。

-layout

在這個方法里調用 super 之后,布局規則對象會把所有的子節點都計算并且定位好,所以這個時間點是你手動進行布局所有子view的時機。或許更有用的是,有時候你想手動布局,但并不太容易創建一個布局規則對象,或者有時候你不想等所有子節點布局完畢,而只是很簡單的手動設置frame,如果是這樣的話,就在這個方法里寫。

layoutSpecThatFits

這個方法就是用來建立布局規則對象,產生 node 大小以及所有子 node 大小的地方,你創建的布局規則對象一直持續到這個方法返回的時間點,經過了這個時間點后,它就不可變了。尤其重要要記住的一點事,千萬不要緩存布局規則對象,當你以后需要他的時候,請重新創建。

ASViewController

ASViewControllerUIViewController 的子類,包含了管理 node 的特性。因此它的所有方法一定要在主線程中使用。

-init

這個方法只調用一次,是在 ASViewController 的生命周期的最開始的時候調用。在它初始化的過程中,不要使用 self.view 或者 self.node.view ,它會強制 view 被提前創建。這些事情應該在 viewDidLoad 中完成。

ASViewController 的初始化方法是 initWithNode: ,代碼如下所示。一個 ASViewController 管理節點就像 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

建議不要使用這個方法,因為它相對于 viewDidLoad 來說沒有明顯的優勢反而有很多不足的地方。但如果你不去設置 self.view 的屬性就沒什么問題。調用 [super loadView] 它就會執行 node.view

-viewDidLoad

它會在 ASViewController 的生命周期的最開始調用,僅次于 -loadView 。這是你使用節點的 view 最早的時機。在這個方法里適合放只執行一次并且要使用 view/layer 的代碼,比如加手勢。

布局的代碼千萬不要放在這個方法里,因為界面發生改變也不會再調用這個方法重新布局。

-viewWillLayoutSubviews

這個方法調用的時機和節點 -layout 方法調用的時機一樣,它可以被執行很多次。只要它的節點被改變(比如旋轉,分屏,顯示鍵盤)或者繼承()都會立即被調用。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,748評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,165評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,595評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,633評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,435評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,943評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,035評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,175評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,713評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,599評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,788評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,303評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,034評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,412評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,664評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,408評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,747評論 2 370

推薦閱讀更多精彩內容