iOS 高性能異構(gòu)滾動(dòng)視圖構(gòu)建方案- LazyScrollView 詳細(xì)用法

LazyScrollView 終于被開源了,一些東西可以被拿出來繼續(xù)說一下。

Github 鏈接 : https://github.com/alibaba/LazyScrollView

如果是第一次接觸LazyScrollView,建議先看一下之前的文章,了解一下具體原理http://pingguohe.net/2016/01/31/lazyscroll.html

Demo請直接Clone Github工程,在master分支,打開LazyScrollViewDemo文件夾下的工程

具體用法都在ViewController這個(gè)類內(nèi)。

TMMuiLazyScrollView *scrollview = [[TMMuiLazyScrollView alloc]init];
scrollview.frame = self.view.bounds;   
scrollview.dataSource = self;    
[self.view addSubview:scrollview];

和正常的ScrollView一樣init即可,只需要注意一點(diǎn)的是,需要有一個(gè)實(shí)現(xiàn)TMMuiLazyScrollViewDataSource的類,賦給LazyScrollView的dataSource

實(shí)現(xiàn) TMMuiLazyScrollViewDataSource

返回View個(gè)數(shù)

- (NSUInteger)numberOfItemInScrollView:(TMMuiLazyScrollView *)scrollView

這里需要返回view的個(gè)數(shù),決定返回多少個(gè)rectModel

返回RectModel

- (TMMuiRectModel *)scrollView:(TMMuiLazyScrollView *)scrollView rectModelAtIndex:(NSUInteger)index

根據(jù)index返回TMMuiRectModel

TMMuiRectModel有兩個(gè)屬性,一個(gè)是muiID,它是View的唯一標(biāo)識(shí)符, 另一個(gè)是absoluteRect,是對應(yīng)的View在LazyScrollView內(nèi)的絕對坐標(biāo)

按需返回視圖

- (UIView *)scrollView:(TMMuiLazyScrollView *)scrollView itemByMuiID:(NSString *)muiID

這個(gè)方法在需要生成即將進(jìn)入屏幕的視圖的時(shí)候,會(huì)被LazyScrollView按需調(diào)用 muiID就是rectModel的muiID,可以根據(jù)muiID生成相關(guān)的View

這里一般會(huì)先去找復(fù)用的視圖,沒有再做生成

Demo中這個(gè)方法內(nèi)部的寫法是:

LazyScrollViewCustomView *label = (LazyScrollViewCustomView *)[scrollView dequeueReusableItemWithIdentifier:@"testView"];
    NSInteger index = [muiID integerValue];
    if (!label)
    {
        label = [[LazyScrollViewCustomView alloc]initWithFrame:[(NSValue *)[rectArray objectAtIndex:index]CGRectValue]];
        label.textAlignment = NSTextAlignmentCenter;
        label.reuseIdentifier = @"testView";
    }
    label.frame = [(NSValue *)[rectArray objectAtIndex:index]CGRectValue];
    label.text = [NSString stringWithFormat:@"%lu",(unsigned long)index];

流程是:先取一下復(fù)用池中可復(fù)用的View,有的話,賦給對應(yīng)的frame,沒有的話,生成一個(gè),并給予一個(gè)復(fù)用標(biāo)記。

在 LazyScrollView 中聲明的一個(gè)對UIView 的 category 中包含了 reuseIdentifier,可以給任意的View綁定這個(gè)屬性。如果沒有賦值reuseIdentifier或者給一個(gè)nil/空字符串,會(huì)認(rèn)為這個(gè)組件不復(fù)用。

刷新視圖

設(shè)置一下contentSize , 并且Reload一下即可。

scrollview.contentSize = CGSizeMake(CGRectGetWidth(self.view.bounds), 1230);
 [scrollview reloadData];

視圖生命周期

Demo中的LazyScrollViewCustomView實(shí)現(xiàn)了TMMuiLazyScrollViewCellProtocol的三個(gè)方法,可以在組件的生命周期的時(shí)候執(zhí)行相關(guān)代碼

- (void)mui_prepareForReuse

在即將被復(fù)用時(shí)調(diào)用,通常用于清空View內(nèi)展示的數(shù)據(jù)。類似與UITableViewCell 的 prepareForReuse

- (void)mui_didEnterWithTimes:(NSUInteger)times

進(jìn)入屏幕LazyScroll可視范圍內(nèi)時(shí)執(zhí)行,times是進(jìn)入可視范圍的次數(shù),從0開始。重置times可以調(diào)用LazyScrollView的resetViewEnterTimes重置times

- (void)mui_afterGetView

LazyScroll獲取到View后執(zhí)行。也就是執(zhí)行完- (UIView *)scrollView:(TMMuiLazyScrollView *)scrollView itemByMuiID:(NSString *)muiID方法獲取到視圖之后。

和didEnterWithTimes的區(qū)別是,因?yàn)長azyScrollView有一個(gè)RenderBuffer的概念,實(shí)際渲染的視圖比可視范圍上下各增加了20個(gè)像素,使得展示更加流暢。afterGetView會(huì)執(zhí)行的更早。

后續(xù)

LazyScrollView 屬于相對底層的視圖層,在復(fù)用上提供的比較高的靈活度。一些更高程度的封裝,比如類似UICollection的Layout,對復(fù)用更簡易的管理,對組件的解析、賦值等管理,我們都放在了Tangram里面,關(guān)于Tangram 可見 http://pingguohe.net/2016/12/20/Tangram-design-and-practice.html

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

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

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