What's New in iOS 10 -- UICollectionView

花了一上午時(shí)間,看完WWDC2016中UICollectionView相關(guān)內(nèi)容

參考自:What's New in UICollectionView in iOS 10

簡(jiǎn)單總結(jié):

1.UICollectionView、UITableView修改了cell的生命周期,增加了pre-fetch(預(yù)加載)功能,以及相應(yīng)的API


iOS10以前,cell的生命周期

--- cell即將出現(xiàn),馬上要使用的時(shí)候

a.prepareForReuse ?cell重置及恢復(fù)默認(rèn)狀態(tài)、準(zhǔn)備接收新數(shù)據(jù)

b.cellForItemAtIndexPath 大部分工作都在這執(zhí)行,比如將數(shù)據(jù)填充到cell上,

c.willDisplayCell 這是app提供的最后一個(gè)機(jī)會(huì),為cell展示做最后的工作

--- cell消失

a.didEndDisplayingCell?

b. 進(jìn)入reuse queue

iOS10

--- cell預(yù)加載

a.prefetchItemsAtIndexPaths

--- 此時(shí)還沒到進(jìn)入屏幕的時(shí)候

b.prepareForReuse

c.cellForItemAtIndexPath

--- 即將出現(xiàn)(從collectionView外進(jìn)入collectionView的那一瞬間)

d.willDisplayCell

--- cell消失

a.didEndDisplayingCell

b.暫緩進(jìn)入reuse queue ??。。?/p>

優(yōu)化的原因:

多數(shù)app中,使用UICollectionView(包括UITableView),大部分操作都在cellFor中,準(zhǔn)備cell的過程中,時(shí)間代價(jià)昂貴。比如解析圖片、訪問數(shù)據(jù)庫(kù)、從coreData加載數(shù)據(jù)等等。這些操作時(shí)間一般都在主線程中,當(dāng)整個(gè)時(shí)間超過16.667毫秒時(shí),即幀數(shù)少于60,就會(huì)出現(xiàn)掉幀現(xiàn)象,這樣給用戶的體驗(yàn)是相當(dāng)差的。

改動(dòng)點(diǎn)

增加屬性 prefetchEnabled。 默認(rèn)打開。

新增protocol ?prefetchDataSource。?

// 預(yù)加載內(nèi)容 --- 如異步加載數(shù)據(jù)

@require

- (void)collectionView:(UICollectionView *)collectionView prefetchItemsAtIndexPaths:(NSArray *)indexPaths;

// 對(duì)之前的一些加載可以取消或者降低優(yōu)先級(jí)

@optional

- (void)collectionView:(UICollectionView *)collectionView cancelPrefetchingForItemsAtIndexPaths:(NSArray *)indexPaths;

注:cellForItemAtIndexPath所準(zhǔn)備的cell可能永遠(yuǎn)不會(huì)真正消失【僅僅只是隱藏】

同樣的。UITableView也加入了pre-fetch的相關(guān)功能

2.優(yōu)化self-sizing cell

現(xiàn)在有三種方式可以動(dòng)態(tài)計(jì)算cell的大小。

a.autoLayout --- 給cell的contentView添加約束,會(huì)通過autoLayout系統(tǒng)動(dòng)態(tài)獲取cell的size

b.重寫cell的sizeThatFits()

c.重寫preferredLayoutAttributesFittingAttributes() 【還可以改變alpha、transform等】

大多數(shù)時(shí)候,cell的size是難以預(yù)估、猜測(cè)的,因此給UICollectionViewFlowLayout的estimatedItemSize增加可選值 UICollectionViewFlowLayoutAutomaticSize

layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize


3.優(yōu)化UICollectionView重新排序

去年新增reordering相關(guān)的API。

// 手勢(shì)begin時(shí),通過該方法啟動(dòng)interactiveMovement

beginInteractiveMovementForItem

// 手勢(shì)changed時(shí),通過該方法更新cell位置

updateInteractiveMovementTargetPosition

// 手勢(shì)結(jié)束時(shí),通過該方法放下cell,結(jié)束interactiveMovement,并且處理數(shù)據(jù)

endInteractiveMovement

// 手勢(shì)取消時(shí),通過該方法將cell恢復(fù)原位,并取消interactiveMovement

cancelInteractiveMovement,

iOS10中,僅在iOS9的基礎(chǔ)上做了一些優(yōu)化

a. UICollectionViewController中,增加屬性installsStandardGestureForInteractiveMovement??梢宰詣?dòng)添加手勢(shì),并且調(diào)用上述方法。

b.增加翻頁(yè)功能。類似于iOS系統(tǒng),桌面app移動(dòng)到邊緣翻頁(yè)的效果。 接口即UIScrollView的isPagingEnagled。

4.UICollectionView、UITableView、UIScrollView增加屬性refreshControl

UIRefreshControl可以單獨(dú)在UICollectionView、UITableView、UIScrollView中使用。進(jìn)API文檔可以發(fā)現(xiàn),refreshControl為UIRefreshControlHosting協(xié)議中的屬性,以上三個(gè)類都遵循了該協(xié)議。


詳細(xì)的效果及資料,大家可以進(jìn)官網(wǎng)看視頻、或者看PPT~這里就不一一貼出來了~~~?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容