工作中,很容易碰到跑马灯效果,网上的感觉都不怎么满意,就自己封装了个。
注意:只有一个时,会自动补足多个,循环播放
优点:支持autolayout布局、不仅限于label展示、宽度缓存处理、视图因需生成、用法简单和UItableView类似,可看demo
下载连接:https://github.com/wokua/LYHEntertainingDiversions-OC.git喜欢的话麻烦打个星支持下
用法:
一、引入runhouse文件夹中的所有文件,导入 "UIRunHouseView.h"文件:
#import "UIRunHouseView.h"
二、配置数据源:UIRunHouseViewDatasourse:
生成view可以frame也可以autolayout布局,这里为了方便
设置space属性实现item间距,默认30
self.runHouse = [[UIRunHouseView alloc]initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, 40)];
self.runHouse.datasourse = self;
三、注册重用cell:
如果需要重用前处理数据,cell请使用UIRunHouseItem子类,重写prepareforreuse。
如果不需要,cell直接uiview子类即可
[self.runHouse registerClass:LYHCustomRunHouseView.class forCellReuseIdentifier:@"LYHCustomRunHouseView"];
[self.runHouse registerClass:LYHImageTitleVIew.class forCellReuseIdentifier:@"LYHImageTitleVIew"];
四、实现数据源方法:
-(NSInteger)numberOfItemsInRunHouseView:(UIRunHouseView *)view; //一共多少个item
-(CGFloat)runHouseView:(UIRunHouseView *)runHouseView widthForIndex:(int)index; //每个item的宽度,内部已经进行宽度缓存,外面不再需要
-(nullable UIRunHouseItem *)runHouseView:(UIRunHouseView *)runHouseView itemForIndex:(int)index; //每个位置对应的视图
举例:
- (NSInteger)numberOfItemsInRunHouseView:(UIRunHouseView *)view{
return self.datas.count;
}
- (UIRunHouseItem *)runHouseView:(UIRunHouseView *)runHouseView itemForIndex:(int)index{
if (index % 2 == 0) {
LYHCustomRunHouseView * item = (LYHCustomRunHouseView *)[runHouseView dequeneItemViewResueIdentity:@"LYHCustomRunHouseView"];
if (item == nil) {
item = [LYHCustomRunHouseView new];
}
item.backgroundColor = [UIColor redColor];
item.label.text = self.datas[index];
return item;
}else{
LYHImageTitleVIew * item = (LYHImageTitleVIew *)[runHouseView dequeneItemViewResueIdentity:@"LYHImageTitleVIew"];
if (item == nil) {
item = [LYHImageTitleVIew new];
}
item.backgroundColor = [UIColor redColor];
item.label.text = self.datas[index];
item.imageView.image = [UIImage imageNamed:@"Image"];
return item;
}
}
- (CGFloat)runHouseView:(UIRunHouseView *)runHouseView widthForIndex:(int)index{
NSString * str = self.datas[index];
UIFont * font = [UIFont systemFontOfSize:20];
CGRect rect = [str boundingRectWithSize:CGSizeMake(0, 40) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font}context:nil];
if (index % 2 == 0) {
return rect.size.width + 10;
}else{
return rect.size.width + 30;
}
}
四、reloaddata刷新数据
好了,一个跑马灯就完成了