我們項目中的一個需求仇穗,需用UICollectionView展示上萬個cell流部,cell中包含的內(nèi)容過于豐富,如果一次性加載所有數(shù)據(jù)源纹坐,系統(tǒng)的CPU枝冀、內(nèi)存都將占用過多。
為了更好的性能耘子,決定創(chuàng)建一個SimpleModel類果漾,一個DetailModel類,初次加載時用簡單model填充cell谷誓,加載完成后再用完整的model填充當前顯示的cell绒障。
但怎么檢測UICollectionView停止?jié)L動成了問題(停止?jié)L動后展示完整信息)。
經(jīng)過調(diào)查捍歪,發(fā)現(xiàn)UICollectionView有3種停止?jié)L動類型户辱,分別是:1、快速滾動糙臼,自然停止庐镐;2、快速滾動变逃,手指按壓突然停止必逆;3、慢速上下滑動停止。
第1種類型在UIScrollView 的Delegate可檢測:
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
但第2名眉、第3種卻沒有暴露方法供使用粟矿,但會觸發(fā)Delegate:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate璧针;
繼續(xù)分析,UIScrollView有三個Bool類型屬性:tracking渊啰、dragging探橱、decelerating,在滾動和結(jié)束滾動時都有自己的值绘证。
在3種動作觸發(fā)的兩個方法中隧膏,tracking、dragging嚷那、decelerating 的Bool值分別為:
停止類型1:DidEndDecelerat:0,dragging:0,decelerating:0
停止類型2:DidEndDragging:tracking:1,dragging:0,decelerating:1
DidEndDecelerat:tracking:0,dragging:0,decelerating:0
停止類型3:DidEndDragging:tracking:1,dragging:0,decelerating:0
上面三種動作結(jié)束后胞枕,只要捕捉到tracking、dragging魏宽、decelerating的1個組合即可監(jiān)測到UICollectionView的停止?jié)L動腐泻。
具體實現(xiàn)如下:
#pragma mark - UIScrollDelegate
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
// 停止類型1、停止類型2
BOOL scrollToScrollStop = !scrollView.tracking && !scrollView.dragging && !scrollView.decelerating;
if (scrollToScrollStop) {
[self scrollViewDidEndScroll];
}
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
if (!decelerate) {
// 停止類型3
BOOL dragToDragStop = scrollView.tracking && !scrollView.dragging && !scrollView.decelerating;
if (dragToDragStop) {
[self scrollViewDidEndScroll];
}
}
}
#pragma mark - scrollView 停止?jié)L動監(jiān)測
- (void)scrollViewDidEndScroll {
}