AsyncDisplayKit使用(干貨)

首先提一些題外話履怯,如果你還不知道“AsyncDisplayKit”或者叫“Texture”是干啥的,請(qǐng)度娘“AsyncDisplayKit”亡容。這里我只寫一些iOS開發(fā)時(shí)比較常用的一些知識(shí)點(diǎn)忍疾,還有相關(guān)的寫法沸毁,我盡量用最大白話的方式寫出來什么時(shí)候該怎么用问窃。如果想了解更多請(qǐng)參考官方文檔『蓿現(xiàn)在度娘出來好多都是copy的同一個(gè)帖子,寫的都是官方話域庇,讓很多新手入門還是有些難度的嵌戈,我也是一點(diǎn)點(diǎn)看文檔摸索出來的,如果你看到本文较剃,那么恭喜你,新手朋友技健,你可以省了好多事了写穴,不過知道怎么用后,最好還是再查查文檔雌贱,明白它的原理這才是最主要的啊送。給大家推薦一篇文章,里面原理什么的寫的很詳細(xì)欣孤,那么現(xiàn)在開始干貨時(shí)間馋没!

一.怎么看我運(yùn)行時(shí)的幀數(shù)

請(qǐng)參考YYKit中的YYFPSLabel,這里我就不多說了降传。

二.ASTableNode

ASTableNode代替了UITableView篷朵,因此需要繼承ASTableDelegate與ASTableDataSource這兩個(gè)代理。

1.我要用的方法在ASTableNode中沒找到怎么辦?

ASTableNode廢棄了UITableView的heightForRowAtIndexPath方法声旺,因?yàn)锳STableNode需要讓每個(gè)cellNode自己通過布局約束(后面會(huì)提到)來管理自己的高度笔链。至于heightForHeaderInSection、heightForFooterInSection腮猖、viewForHeaderInSection鉴扫、viewForFooterInSection等等,在ASTableNode沒有相關(guān)重定義方法澈缺,因此直接按UITableView的寫就可以了坪创,畢竟它還算是UITableView的。

2.預(yù)加載使用

ASTableNode為了使滑動(dòng)更為順暢姐赡,它提供了一套預(yù)加載的策略(類似的于無限滾動(dòng))莱预,只需要在初始化時(shí)候加上self.tableNode.view.leadingScreensForBatching = 1.0;默認(rèn)值是2,它的意思是將 leadingScreensForBatching 設(shè)置為 1.0 表示你當(dāng)用戶滾動(dòng)還剩 1 個(gè)全屏就到達(dá)數(shù)據(jù)末尾時(shí)雏吭,就開始抓取新的一批數(shù)據(jù)锁施。這里需要關(guān)聯(lián)如下兩個(gè)方法:

- (BOOL)shouldBatchFetchForTableNode:(ASTableNode*)tableNode

{

????return YES;

}

這個(gè)方法告訴表格,在這次批抓取之后是否還可以進(jìn)行新的批抓取杖们。如果你知道 API 上的數(shù)據(jù)什么時(shí)候結(jié)束悉抵,返回 NO,表示不用進(jìn)行新的批抓取了摘完。

- (void)tableNode:(ASTableNode*)tableNode willBeginBatchFetchWithContext:(ASBatchContext*)context

{

????[context beginBatchFetching];

????//你獲取數(shù)據(jù)的相關(guān)邏輯

????[context completeBatchFetching:YES];

}

這個(gè)方法在用戶即將滾動(dòng)到表格末尾并且 -shouldBatchFetchForTableNode: 方法返回 YES 時(shí)調(diào)用姥饰。千萬要記得獲取數(shù)據(jù)后加上[context completeBatchFetching:YES];否則會(huì)認(rèn)為你數(shù)據(jù)處理沒有完成,不會(huì)繼續(xù)加載以后的數(shù)據(jù)孝治。

3.ASTableNode與UITableView代理方法替換:

- (NSInteger)numberOfSectionsInTableNode:(ASTableNode*)tableNode;

代替:

- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView;


- (NSInteger)tableNode:(ASTableNode*)tableNode numberOfRowsInSection:(NSInteger)section;

代替:

- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section;


- (ASCellNodeBlock)tableNode:(ASTableNode*)tableNode nodeBlockForRowAtIndexPath:(NSIndexPath*)indexPath;

代替:

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath;


- (void)tableNode:(ASTableNode*)tableNode didSelectRowAtIndexPath:(NSIndexPath*)indexPath;

代替:

- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath;

4.關(guān)于列表滑動(dòng)掉幀厲害怎么破列粪?

寫好了列表后,滑動(dòng)時(shí)候還是覺得卡頓谈飒,感覺并沒有傳說中的像Baby一樣絲滑岂座,后來找了好多帖子,并一一試過了杭措,最終操作是在初始化tableNode時(shí)费什,給定tableNode一個(gè)默認(rèn)的高度self.tableNode.view.estimatedRowHeight = 0;我寫的是0,可以根據(jù)自己的情況改手素。

5.[self.tableNode reloadData]時(shí)閃瞎了我的24K純金眼怎么辦鸳址!

解決辦法就是......你不用reloadData唄,每次reloadData整個(gè)列表都會(huì)全閃一下泉懦,體驗(yàn)感很差稿黍,因此使用

[UIView performWithoutAnimation:^{

????[self.tableNode insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];

}];

的方式,為毛線要加performWithoutAnimation崩哩,你自己試試就知道了巡球,呵呵呵言沐。

二.ASCellNode的使用

關(guān)于ASTableView的簡介請(qǐng)戳這里,寫的很明白了辕漂。

ASCellNode就兩點(diǎn)需要注意一下:

1.初始化視圖時(shí)要把數(shù)據(jù)傳進(jìn)來呢灶,初始化時(shí)候直接通過數(shù)據(jù)賦值。

2.- (ASLayoutSpec*)layoutSpecThatFits:(ASSizeRange)constrainedSize;這個(gè)方法一定要寫钉嘹,需要在里面寫布局約束來實(shí)現(xiàn)cellNode的高度控制鸯乃。

三.布局約束

ASStackLayoutSpec使用flexbox算法來確定其子節(jié)點(diǎn)的位置和大小,具體用法請(qǐng)戳這里跋涣,下面我會(huì)解釋一下布局的原理缨睡。


以官方文檔中的圖為例:

在寫布局前一定要記住的一個(gè)規(guī)則,把相關(guān)的視圖模塊化(自己的理解陈辱,請(qǐng)大神嘴下留情)奖年。

如上圖:

1.設(shè)置一個(gè)絕對(duì)布局ASAbsoluteLayoutSpec來約束中間的播放按扭。(初始化時(shí)候記得給定寬高沛贪,沒有寬高會(huì)出問題的)

2.設(shè)置一個(gè)ASCenterLayoutSpec的布局陋守,centeringOptions為XY居中,sizingOptions默認(rèn)方式就好利赋,具體干嘛的水评,自己去看文檔。child就是上一步的絕對(duì)布局約束對(duì)象媚送,這樣才能把當(dāng)前約束與之前的約束關(guān)聯(lián)起來中燥。

3.設(shè)置完播放按鈕的中心布局,那么這個(gè)中心相對(duì)的是誰呢塘偎,請(qǐng)看圖中的綠框框疗涉,這里需要用到的是ASOverlayLayoutSpec覆蓋布局,畢竟你要把播放按鈕覆蓋到后面的背景圖嘛吟秩,這個(gè)背景圖的布局請(qǐng)參考步驟1咱扣。overlayLayoutSpecWithChild中有兩個(gè)參數(shù),Child你要放到下面的視圖涵防,overlay上面的視圖闹伪。

----------------------------------------------綠框布局約束模塊,完成----------------------------------------------

4.兩個(gè)藍(lán)框部份武学,以下面藍(lán)框布局為例(元素比較多祭往,第一個(gè)藍(lán)框可以參考這里完成)峭拘,首先看細(xì)化部分了罪,紅色區(qū)域届垫,里面有兩個(gè)textNode,上下布局熏矿,使用ASStackLayoutSpec來完成,垂直方向,spacing控件間隔票编,justifyContent主軸排列方式為start褪储,childred為兩個(gè)textnode的數(shù)組(注意順序)。

5.下面的藍(lán)框里有兩個(gè)需要布局的元素慧域,圖片和紅框的相對(duì)布局約束鲤竹,左右排列,因此昔榴,還需要?jiǎng)?chuàng)建一個(gè)相對(duì)約束ASStackLayoutSpec辛藻,水平方向,間隔互订,主軸排列方式為start吱肌,children為圖片及紅框的布局約束。這里的圖片布局請(qǐng)參考步驟1仰禽。

----------------------------------------------藍(lán)框布局約束模塊氮墨,完成----------------------------------------------

6.兩個(gè)藍(lán)框中間的textnode,由于沒有相對(duì)視圖吐葵,因此直接可以使用到最外層的相對(duì)布局中规揪,也就是橘黃色的框框,也是相對(duì)ASStackLayoutSpec折联,垂直方向粒褒,主軸排列方式為start,children為綠框約束诚镰、藍(lán)框1約束奕坟、textnode、藍(lán)框2約束清笨。

----------------------------------------------橘黃框布局約束模塊月杉,完成----------------------------------------------

7.以上就是內(nèi)容的所有布局說明,在設(shè)計(jì)時(shí)抠艾,可能需要上左下右都要有邊距苛萎,所以,請(qǐng)使用ASInsetLayoutSpec插入布局检号,給橘黃框加邊距腌歉,將此ASInsetLayoutSpec對(duì)象返回。

----------------------------------------------內(nèi)容布局約束模塊齐苛,完成----------------------------------------------

8.將以上所有布局規(guī)則寫入- (ASLayoutSpec*)layoutSpecThatFits:(ASSizeRange)constrainedSize;方法并返回最終的布局規(guī)則就全部OK了翘盖。

在開發(fā)中設(shè)計(jì)給的UI可能還要比這個(gè)要繁瑣,請(qǐng)新手朋友們認(rèn)真參考上圖加下面的邏輯凹蜂,還有別人寫的demo馍驯,在最下方阁危。布局最主要的還是要模塊化,從最小的開始汰瘫,一點(diǎn)一點(diǎn)組合狂打,最后拼成全部的內(nèi)容區(qū)域。

四.flexShrink的使用

ASTextNode的maximumNumberOfLines(相當(dāng)于UILabel的numberOfLines)默認(rèn)是0混弥,因此它是自動(dòng)擴(kuò)充的趴乡,當(dāng)并排有兩個(gè)視圖需要布局,我們想其中的textNode顯示不下就縮進(jìn)蝗拿,因此就需要用到textNode.style.flexShrink = YES浙宜,如果你給某一個(gè)textNode設(shè)置了這個(gè)屬性,那么請(qǐng)記住蛹磺,跟這個(gè)控件有關(guān)的全部約束都需要添加這個(gè)屬性粟瞬,不論它被包了多少層!

五.ASTableNode+MJRefresh

MJRefresh是iOS開發(fā)時(shí)萤捆,用的比較多的刷新庫了裙品,想要知道怎么用,請(qǐng)戳這里俗或。

六.ASNetworkImageNode換緩存策略換成YYWebImage

請(qǐng)戳這里市怎,ASNetworkImageNode下載圖片,請(qǐng)使用擴(kuò)展下面的- (void)setUrlStr:(NSString*)urlString placeholderImage:(UIImage*)placeholderImage;至說原理請(qǐng)自己看源碼辛慰,網(wǎng)上也有不過是swift版区匠,這里是oc版,初始化時(shí)候需要調(diào)用ASNetworkImageNode的類方法+ (id)imageNode;

七.使用ASTextNode還怎么使用TTTAttributedLabel帅腌?

還是戳這里驰弄,集成ASTextNode寫了一個(gè)子類,基本實(shí)現(xiàn)了加行間距速客,字間距戚篙,對(duì)齊方式,還有給文本中某段文字加點(diǎn)擊鏈接溺职。使用方法跟TTTAttributedLabel一樣岔擂,繼承ASTextNodeDelegate下的代理方法

- (void)textNode:(ASTextNode*)textNode tappedLinkAttribute:(NSString*)attribute value:(id)value atPoint:(CGPoint)point textRange:(NSRange)textRange

實(shí)現(xiàn)跳轉(zhuǎn)。

如果你使用此功能需要使用FuASTextNode浪耘,在調(diào)用addTextLink方法前設(shè)置textNode.linkAttributeNames= @[@"kLinkAttributeName"];(這里也可以根據(jù)你的需要自己替換相關(guān)字符串)乱灵。

在addTextLink的block方法里調(diào)用mutableAttributedString的addAttributes方法添加

@{

????@"kLinkAttributeName":url(你的url鏈接,可以是string七冲,你存的是什么類型痛倚,在代理方法里取就是什么類型),

????NSForegroundColorAttributeName:color(高亮顏色)

}

請(qǐng)參考這里

八.一些小的擴(kuò)展

還是戳這里癞埠,里面有一些擴(kuò)展状原,例如加圓角呀、描邊呀苗踪、普通字符串簡單變色呀颠区,寫法簡單粗暴,大神勿噴通铲。


以上就是我使用AsyncDisplayKit時(shí)毕莱,遇到問題處理的一些辦法,如果有問題請(qǐng)?jiān)谙路搅粞浴?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颅夺,一起剝皮案震驚了整個(gè)濱河市朋截,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吧黄,老刑警劉巖部服,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拗慨,居然都是意外死亡廓八,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門赵抢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剧蹂,“玉大人,你說我怎么就攤上這事烦却〕璧穑” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵其爵,是天一觀的道長冒冬。 經(jīng)常有香客問我,道長摩渺,這世上最難降的妖魔是什么窄驹? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮证逻,結(jié)果婚禮上乐埠,老公的妹妹穿的比我還像新娘。我一直安慰自己囚企,他們只是感情好丈咐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著龙宏,像睡著了一般棵逊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上银酗,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天辆影,我揣著相機(jī)與錄音徒像,去河邊找鬼。 笑死蛙讥,一個(gè)胖子當(dāng)著我的面吹牛锯蛀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播次慢,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼旁涤,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了迫像?” 一聲冷哼從身側(cè)響起劈愚,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闻妓,沒想到半個(gè)月后菌羽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡由缆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年算凿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犁功。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氓轰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浸卦,到底是詐尸還是另有隱情署鸡,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布限嫌,位于F島的核電站靴庆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏怒医。R本人自食惡果不足惜炉抒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望稚叹。 院中可真熱鬧焰薄,春花似錦、人聲如沸扒袖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽季率。三九已至野瘦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鞭光。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工吏廉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惰许。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓席覆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啡省。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容