花了一上午時(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 ?!I倨帷臼膏!
優(yōu)化的原因:
多數(shù)app中,使用UICollectionView(包括UITableView)示损,大部分操作都在cellFor中渗磅,準(zhǔn)備cell的過(guò)程中,時(shí)間代價(jià)昂貴检访。比如解析圖片始鱼、訪問(wèn)數(shù)據(jù)庫(kù)、從coreData加載數(shù)據(jù)等等脆贵。這些操作時(shí)間一般都在主線程中医清,當(dāng)整個(gè)時(shí)間超過(guò)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ì)通過(guò)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í)闺金,通過(guò)該方法啟動(dòng)interactiveMovement
beginInteractiveMovementForItem
// 手勢(shì)changed時(shí),通過(guò)該方法更新cell位置
updateInteractiveMovementTargetPosition
// 手勢(shì)結(jié)束時(shí)峰档,通過(guò)該方法放下cell败匹,結(jié)束interactiveMovement,并且處理數(shù)據(jù)
endInteractiveMovement
// 手勢(shì)取消時(shí)讥巡,通過(guò)該方法將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~這里就不一一貼出來(lái)了~~~?