LazyScrollView 終于被開源了蜜暑,一些東西可以被拿出來(lái)繼續(xù)說(shuō)一下饶唤。
Github 鏈接 : https://github.com/alibaba/LazyScrollView
如果是第一次接觸LazyScrollView畅蹂,建議先看一下之前的文章霜第,了解一下具體原理http://pingguohe.net/2016/01/31/lazyscroll.html
Demo請(qǐng)直接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善绎,是對(duì)應(yīng)的View在LazyScrollView內(nèi)的絕對(duì)坐標(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,有的話牧嫉,賦給對(duì)應(yīng)的frame剂跟,沒有的話,生成一個(gè)酣藻,并給予一個(gè)復(fù)用標(biāo)記曹洽。
在 LazyScrollView 中聲明的一個(gè)對(duì)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)長(zhǎng)azyScrollView有一個(gè)RenderBuffer的概念,實(shí)際渲染的視圖比可視范圍上下各增加了20個(gè)像素惕澎,使得展示更加流暢莉测。afterGetView會(huì)執(zhí)行的更早。
后續(xù)
LazyScrollView 屬于相對(duì)底層的視圖層唧喉,在復(fù)用上提供的比較高的靈活度捣卤。一些更高程度的封裝,比如類似UICollection的Layout八孝,對(duì)復(fù)用更簡(jiǎn)易的管理董朝,對(duì)組件的解析、賦值等管理干跛,我們都放在了Tangram里面子姜,關(guān)于Tangram 可見 http://pingguohe.net/2016/12/20/Tangram-design-and-practice.html