TMMuiLazyScrollView的使用详解
来源:互联网 发布:狮王酵素牙膏知乎 编辑:程序博客网 时间:2024/06/06 09:43
LazyScrollView 是一个高性能的 scrollView 重用布局框架, 实现了视图的重用和自动加载。
使用时候的核心代码:
// This protocol represents the data model object.@class TMMuiLazyScrollView;@protocol TMMuiLazyScrollViewDataSource <NSObject>@required- (NSUInteger)numberOfItemInScrollView:(nonnull TMMuiLazyScrollView *)scrollView; - (nonnull TMMuiRectModel *)scrollView:(nonnull TMMuiLazyScrollView *)scrollView rectModelAtIndex:(NSUInteger)index;- (nullable UIView *)scrollView:(nonnull TMMuiLazyScrollView *)scrollView itemByMuiID:(nonnull NSString *)muiID;@end
类似UITableView的用法,最大的区别就是在布局前计算出每个view的位置frame:
1、获取要展示的个数
2、获取每个view的数据model
3、创建每个视图view
这里的model继承TMMuiRectModel,那么TMMuiRectModel又是怎样的呢?
/** * It is a view model that holding information of view. At least holding absoluteRect and muiID. */@interface TMMuiRectModel: NSObject// A rect that relative to the scroll view.@property (nonatomic, assign) CGRect absoluteRect;// A uniq string that identify a model.@property (nonatomic, copy, nonnull) NSString *muiID;@end
从这里可以看出,每个model必须赋值frame,所以这里需要在布局前计算出每个view的位置frame,还有一个参数muiID,它是View的唯一标识符。对于创建的每个view,可以继承<TMMuiLazyScrollViewCellProtocol>,来监测view的生命周期
protocol TMMuiLazyScrollViewCellProtocol<NSObject>@optional// if call dequeueReusableItemWithIdentifier to get a reuseable view,the same as "prepareForReuse" in UITableViewCell- (void)mui_prepareForReuse;// When view enter the visible area of LazyScrollView ,call this method.// First 'times' is 0- (void)mui_didEnterWithTimes:(NSUInteger)times;// When we need render the view, call this method.// The difference between this method and 'mui_didEnterWithTimes' is there is a buffer area in LazyScrollView(RenderBufferWindow), first we will call 'mui_afterGetView'.- (void)mui_afterGetView;@end
//// ViewController.m// Demo//// Created by 胡梦驰 on 2017/8/2.// Copyright © 2017年 胡梦驰. All rights reserved.//#import "ViewController.h"#import "TMMuiLazyScrollView.h"@interface LazyScrollViewCustomView : UIView<TMMuiLazyScrollViewCellProtocol>@end@implementation LazyScrollViewCustomView//在即将被复用时调用,通常用于清空View内展示的数据。类似与UITableViewCell 的 prepareForReuse- (void)mui_prepareForReuse{ NSLog(@"- Prepare For Reuse -");}//进入屏幕LazyScroll可视范围内时执行,times是进入可视范围的次数,从0开始。重置times可以调用LazyScrollView的resetViewEnterTimes重置times- (void)mui_didEnterWithTimes:(NSUInteger)times{ NSLog(@"- Did Enter With Times -");}//LazyScroll获取到View后执行。也就是执行完- (UIView *)scrollView:(TMMuiLazyScrollView *)scrollView itemByMuiID:(NSString *)muiID方法获取到视图之后。- (void)mui_afterGetView{ NSLog(@"- AfterGetView -");}@end@interface ViewController ()<TMMuiLazyScrollViewDataSource>@property (nonatomic, strong) NSMutableArray *rectArray;@end#define WIDTH self.view.frame.size.width#define HEIGHT self.view.frame.size.height@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; self.rectArray = [NSMutableArray array]; CGFloat height = 0; //一行只放一个view for(int i = 0; i < 2; i++){ CGRect frame = CGRectMake(16, 10+i*60, WIDTH-32, 50); [self.rectArray addObject:[NSValue valueWithCGRect:frame]]; } height += 120; //一行放两个 for(int i = 0; i < 4; i++){ CGRect frame = CGRectMake(16+i%2*((WIDTH-42)/2+10), height+10+i/2*60, (WIDTH-42)/2, 50); [self.rectArray addObject:[NSValue valueWithCGRect:frame]]; } height+= 120; //一行放三个 for(int i = 0; i < 6; i++){ CGRect frame = CGRectMake(16+i%3*((WIDTH-52)/3+10), height+10+i/3*60, (WIDTH-52)/3, 50); [self.rectArray addObject:[NSValue valueWithCGRect:frame]]; } height+= 120; //创建scrollView TMMuiLazyScrollView *scrollView = [[TMMuiLazyScrollView alloc] init]; scrollView.frame = CGRectMake(0, 20, WIDTH, HEIGHT-20); scrollView.dataSource = self; [self.view addSubview:scrollView]; //对scrollview的content大小设置,并加载reloadData scrollView.contentSize = CGSizeMake(WIDTH, height); [scrollView reloadData];}#pragma mark -- DataSource/Delegate- (NSUInteger)numberOfItemInScrollView:(TMMuiLazyScrollView *)scrollView{ return self.rectArray.count;}- (TMMuiRectModel*)scrollView:(TMMuiLazyScrollView *)scrollView rectModelAtIndex:(NSUInteger)index{ CGRect frame = [(NSValue*)self.rectArray[index] CGRectValue]; TMMuiRectModel *model = [[TMMuiRectModel alloc] init]; model.absoluteRect = frame; model.muiID = [NSString stringWithFormat:@"%ld", index]; return model;}- (UIView*)scrollView:(TMMuiLazyScrollView *)scrollView itemByMuiID:(NSString *)muiID{ NSInteger index = muiID.integerValue; CGRect frame = [(NSValue*)self.rectArray[index] CGRectValue]; static NSString *identify = @"hmc"; LazyScrollViewCustomView *view = (LazyScrollViewCustomView*)[scrollView dequeueReusableItemWithIdentifier:identify]; if(!view){ view = [[LazyScrollViewCustomView alloc] initWithFrame:frame reuseIdentifier:identify]; view.backgroundColor = [UIColor cyanColor]; } view.frame = frame; view.backgroundColor = [self randomColor]; //切记要把创建的view添加到scrollview中 [scrollView addSubview:view]; return view;}//随机颜色- (UIColor *)randomColor{ CGFloat hue = ( arc4random() % 256 / 256.0 ); //0.0 to 1.0 CGFloat saturation = ( arc4random() % 128 / 256.0 ) + 0.5; // 0.5 to 1.0,away from white CGFloat brightness = ( arc4random() % 128 / 256.0 ) + 0.5; //0.5 to 1.0,away from black return [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:1]; }@end
阅读全文
0 0
- TMMuiLazyScrollView的使用详解
- SELECT 的使用详解
- vi的使用详解
- session的使用详解
- Netsh 的使用详解
- CWinThread的使用详解
- EhCache的使用详解
- Sed的使用详解
- SimpleDateFormat的使用详解
- gdb的使用详解
- Notification的使用详解
- grep的使用详解
- logmnr 的使用详解
- NSNotificationCenter 的使用详解
- NSNotificationCenter 的使用详解
- spinner的使用详解
- JFreeChart的使用详解
- NSNotificationCenter 的使用详解
- 实体类编写规则
- 值得推荐的C/C++框架和库
- 三分钟学会用SpringMVC搭建最小系统(超详细)
- js中“+”用法
- 操作符优先级全列表,一览表
- TMMuiLazyScrollView的使用详解
- 欢迎使用CSDN-markdown编辑器
- 仿微信图片选择器,一步到位!!!
- 1975-寻找特定字符为首字母的单词
- 堆排序中两种建堆方法的比较
- HDU
- Elasticsearch三节点安装
- listView或者gridView异步加载图片错乱问题
- Loadrunner12开始录制时出现安装证书的警告