iOS 高性能不同结构滚动视图—LazySrcollView 的用法

iOS 高性能异构滚动视图构建方案- LazyScrollView 详细用法

2017-03-03 10:56 编辑: suiling 分类:iOS开发 来源:苹果核 4 3436
iOS开发UIView滚动视图
招聘信息:
iOS维护
Mac开发
应用开发工程师(iOS)
技术合伙人-后端工程师
高级iOS开发工程师
资深软件研发工程师
嵌入式软件工程师
Unity3D手游客户端主程
iOS Developer
微信书城开发
数字图书商城开发

LazyScrollView 终于被开源了,一些东西可以被拿出来继续说一下。

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

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

Demo请直接Clone Github工程,在master分支,打开LazyScrollViewDemo文件夹下的工程

具体用法都在ViewController这个类内。

创建视图
TMMuiLazyScrollView *scrollview = [[TMMuiLazyScrollView alloc]init];
scrollview.frame = self.view.bounds;
scrollview.dataSource = self;
[self.view addSubview:scrollview];
和正常的ScrollView一样init即可,只需要注意一点的是,需要有一个实现TMMuiLazyScrollViewDataSource的类,赋给LazyScrollView的dataSource

实现 TMMuiLazyScrollViewDataSource

返回View个数

  • (NSUInteger)numberOfItemInScrollView:(TMMuiLazyScrollView *)scrollView
    这里需要返回view的个数,决定返回多少个rectModel

返回RectModel

  • (TMMuiRectModel )scrollView:(TMMuiLazyScrollView )scrollView rectModelAtIndex:(NSUInteger)index
    根据index返回TMMuiRectModel

TMMuiRectModel有两个属性,一个是muiID,它是View的唯一标识符, 另一个是absoluteRect,是对应的View在LazyScrollView内的绝对坐标

按需返回视图

  • (UIView )scrollView:(TMMuiLazyScrollView )scrollView itemByMuiID:(NSString *)muiID
    这个方法在需要生成即将进入屏幕的视图的时候,会被LazyScrollView按需调用 muiID就是rectModel的muiID,可以根据muiID生成相关的View

这里一般会先去找复用的视图,没有再做生成

Demo中这个方法内部的写法是:
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];
流程是:先取一下复用池中可复用的View,有的话,赋给对应的frame,没有的话,生成一个,并给予一个复用标记。

在 LazyScrollView 中声明的一个对UIView 的 category 中包含了 reuseIdentifier,可以给任意的View绑定这个属性。如果没有赋值reuseIdentifier或者给一个nil/空字符串,会认为这个组件不复用。

刷新视图

设置一下contentSize , 并且Reload一下即可。

scrollview.contentSize = CGSizeMake(CGRectGetWidth(self.view.bounds), 1230);
[scrollview reloadData];
视图生命周期

Demo中的LazyScrollViewCustomView实现了TMMuiLazyScrollViewCellProtocol的三个方法,可以在组件的生命周期的时候执行相关代码

  • (void)mui_prepareForReuse
    在即将被复用时调用,通常用于清空View内展示的数据。类似与UITableViewCell 的 prepareForReuse

  • (void)mui_didEnterWithTimes:(NSUInteger)times
    进入屏幕LazyScroll可视范围内时执行,times是进入可视范围的次数,从0开始。重置times可以调用LazyScrollView的resetViewEnterTimes重置times

  • (void)mui_afterGetView
    LazyScroll获取到View后执行。也就是执行完- (UIView )scrollView:(TMMuiLazyScrollView )scrollView itemByMuiID:(NSString *)muiID方法获取到视图之后。

和didEnterWithTimes的区别是,因为LazyScrollView有一个RenderBuffer的概念,实际渲染的视图比可视范围上下各增加了20个像素,使得展示更加流畅。afterGetView会执行的更早。

后续

LazyScrollView 属于相对底层的视图层,在复用上提供的比较高的灵活度。一些更高程度的封装,比如类似UICollection的Layout,对复用更简易的管理,对组件的解析、赋值等管理,我们都放在了Tangram里面,关于Tangram 可见 http://pingguohe.net/2016/12/20/Tangram-design-and-practice.html

Tangram的开源计划也在进行之中,敬请期待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值