首先提一些題外話履怯,如果你還不知道“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>