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