iOS 星星视图 3行搞定
最近项目需要使用评价的星星视图,自己写了一个玩玩,这个星星视图写的还是比较简单的,初学者可以看一下,大神的话,还请多多指教了~
首先,作为一个视图,初始化代码能少则少!
话不多说,先上初始化的代码:
1 WQLStarView *starView = [[WQLStarView alloc]initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, 40) withTotalStar:5 withTotalPoint:10 starSpace:10]; 2 3 starView.commentPoint = 7; 4 5 [self.view addSubview:starView];
需要传入这么几个参数:星星视图的frame 展示的星星数 星星代表的总分数 星星之间的间隔
然后是效果:
(为了看得清,请原谅我加了个蓝色的边框。中间灰色的是一个输入框,测试用的,请忽略)
我设置的frame的宽度是屏宽,可是此时效果让我很不开心,作为强迫症患者,我要调整。
调整的代码:
1 starView = [[WQLStarView alloc]initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, 40) withTotalStar:5 withTotalPoint:10 starSpace:10]; 2 3 starView.starAliment = StarAlimentCenter; 4 5 starView.commentPoint = 7; 6 7 [self.view addSubview:starView];
这个starAliment是个什么属性?下文会提到。
再看看此时效果:
好了,接下来,看一下我们的核心文件了:
WQLStarView.h
1 typedef NS_ENUM(NSInteger,StarAliment) { 2 StarAlimentDefault, 3 StarAlimentCenter, 4 StarAlimentRight 5 }; 6 7 8 @interface WQLStarView : UIView 9 /** 10 * 评分 11 */ 12 @property (nonatomic,assign) CGFloat commentPoint; 13 /** 14 * 对齐方式 15 */ 16 @property (nonatomic,assign) StarAliment starAliment; 17 18 /** 19 * 初始化方法 20 * 21 * @param frame 整个星星视图的frame 22 * @param totalStar 总的星星的个数 23 * @param totalPoint 星星表示的总分数 24 * @param space 星星之间的间距 25 * 26 * @return WQLStarView 27 */ 28 - (instancetype)initWithFrame:(CGRect)frame withTotalStar:(NSInteger)totalStar withTotalPoint:(CGFloat)totalPoint starSpace:(NSInteger)space;
关键是WQLStarView.m文件了:
初始化方法:
1 - (instancetype)initWithFrame:(CGRect)frame withTotalStar:(NSInteger)totalStar withTotalPoint:(CGFloat)totalPoint starSpace:(NSInteger)space 2 { 3 self = [super initWithFrame:frame]; 4 if (self) { 5 6 //对传进来的frame进行处理,取合适的星星的高度 7 8 //传进来的高度 9 CGFloat height = frame.size.height; 10 //减去间距后的平均的宽度(我设置的星星 高度=宽度) 11 CGFloat averageHeight = (frame.size.width-space*(totalStar-1))/totalStar; 12 13 if (height>averageHeight) { 14 starHeight = averageHeight; 15 }else{ 16 starHeight = height; 17 } 18 19 starBaseTag = 6666; 20 spaceWidth = space; 21 totalNumber = totalStar; 22 singlePoint = totalPoint/totalStar; 23 maxPoints = totalPoint; 24 25 [self loadCustomViewWithTotal:totalStar]; 26 27 } 28 return self; 29 }
加载视图:
1 - (void)loadCustomViewWithTotal:(NSInteger)totalStar 2 { 3 //先铺背景图片(空的星星) 4 for (int i =0 ; i<totalStar; i++) { 5 UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(i*starHeight+i*spaceWidth, self.frame.size.height-starHeight, starHeight, starHeight)]; 6 imageView.tag = starBaseTag+i; 7 imageView.image = [UIImage imageNamed:@"starBackImage"]; 8 [self addSubview:imageView]; 9 } 10 11 }
设置评分分数:
1 //当你设置评分时 开始填充整颗星星 2 - (void)setCommentPoint:(CGFloat)commentPoint 3 { 4 _commentPoint = commentPoint; 5 6 if (commentPoint > maxPoints) { 7 commentPoint = maxPoints; 8 } 9 10 CGFloat showNumber = commentPoint/singlePoint; 11 12 //覆盖的长图 13 if (!starView) { 14 starView = [[UIView alloc]init]; 15 } 16 17 starView.frame = CGRectZero; 18 //整颗星星 19 NSInteger fullNumber = showNumber/1; 20 21 if (starOffset > 0) { 22 starView.frame = CGRectMake(starOffset, self.frame.size.height-starHeight, starHeight*showNumber+spaceWidth*fullNumber, starHeight); 23 24 }else{ 25 starView.frame = CGRectMake(0, self.frame.size.height-starHeight, starHeight*showNumber+spaceWidth*fullNumber, starHeight); 26 27 } 28 starView.clipsToBounds = YES; 29 30 //在长图上填充完整的星星 31 for (int j = 0; j< fullNumber; j++) { 32 UIImageView *starImageView = [[UIImageView alloc]init]; 33 starImageView.image = [UIImage imageNamed:@"starImage"]; 34 starImageView.frame = CGRectMake(j*starHeight+j*spaceWidth, 0, starHeight, starHeight); 35 [starView addSubview:starImageView]; 36 } 37 38 CGFloat part = showNumber - fullNumber; 39 //如果有残缺的星星 则添加 40 if (part > 0) { 41 UIImageView *partImage = [[UIImageView alloc]initWithFrame:CGRectMake(fullNumber*starHeight+fullNumber*spaceWidth, 0, starHeight, starHeight)]; 42 partImage.image = [UIImage imageNamed:@"starImage"]; 43 [starView addSubview:partImage]; 44 } 45 46 [self addSubview:starView]; 47 }
设置对齐方式:
1 //设置星星的对齐方式 2 - (void)setStarAliment:(StarAliment)starAliment 3 { 4 _starAliment = starAliment; 5 6 switch (starAliment) { 7 //居中对齐 8 case StarAlimentCenter: 9 { 10 CGFloat starRealWidth = totalNumber*starHeight+(totalNumber-1)*spaceWidth; 11 CGFloat leftWidth = self.frame.size.width-starRealWidth; 12 13 for (int i =0 ; i< totalNumber; i++) { 14 UIImageView *starImageView = (UIImageView*)[self viewWithTag:i+starBaseTag]; 15 starImageView.frame = CGRectMake(leftWidth/2+starImageView.frame.origin.x, starImageView.frame.origin.y, starImageView.frame.size.width, starImageView.frame.size.height); 16 } 17 starOffset = leftWidth/2; 18 starView.frame = CGRectMake(leftWidth/2+starView.frame.origin.x, starView.frame.origin.y, starView.frame.size.width, starView.frame.size.height); 19 20 } 21 break; 22 //右对齐 23 case StarAlimentRight: 24 { 25 CGFloat starRealWidth = totalNumber*starHeight+(totalNumber-1)*spaceWidth; 26 CGFloat leftWidth = self.frame.size.width-starRealWidth; 27 28 for (int i =0 ; i< totalNumber; i++) { 29 UIImageView *starImageView = (UIImageView*)[self viewWithTag:i+starBaseTag]; 30 starImageView.frame = CGRectMake(leftWidth+starImageView.frame.origin.x, starImageView.frame.origin.y, starImageView.frame.size.width, starImageView.frame.size.height); 31 } 32 starOffset = leftWidth; 33 starView.frame = CGRectMake(leftWidth+starView.frame.origin.x, starView.frame.origin.y, starView.frame.size.width, starView.frame.size.height); 34 35 } 36 break; 37 //默认的左对齐 38 case StarAlimentDefault: 39 { 40 41 for (int i =0 ; i< totalNumber; i++) { 42 UIImageView *starImageView = (UIImageView*)[self viewWithTag:i+starBaseTag]; 43 starImageView.frame = CGRectMake(i*starHeight+i*spaceWidth, self.frame.size.height-starHeight, starHeight, starHeight); 44 } 45 46 47 CGFloat showNumber = self.commentPoint/singlePoint; 48 49 //整颗星星 50 NSInteger fullNumber = showNumber/1; 51 starOffset = 0; 52 starView.frame = CGRectMake(0, self.frame.size.height-starHeight, starHeight*showNumber+spaceWidth*fullNumber, starHeight); 53 54 55 } 56 break; 57 default: 58 { 59 60 } 61 break; 62 } 63 64 65 }
至此,已经完成了星星视图的实现了。
感兴趣的朋友们可以下载看一下:https://github.com/Coolll/WQLStarView
此外,如有不足,请各位大神多多指出来~小的感激不尽~~
---恢复内容结束---
最近项目需要使用评价的星星视图,自己写了一个玩玩,这个星星视图写的还是比较简单的,初学者可以看一下,大神的话,还请多多指教了~
首先,作为一个视图,初始化代码能少则少!
话不多说,先上初始化的代码:
1 WQLStarView *starView = [[WQLStarView alloc]initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, 40) withTotalStar:5 withTotalPoint:10 starSpace:10]; 2 3 starView.commentPoint = 7; 4 5 [self.view addSubview:starView];
需要传入这么几个参数:星星视图的frame 展示的星星数 星星代表的总分数 星星之间的间隔
然后是效果:
(为了看得清,请原谅我加了个蓝色的边框。中间灰色的是一个输入框,测试用的,请忽略)
我设置的frame的宽度是屏宽,可是此时效果让我很不开心,作为强迫症患者,我要调整。
调整的代码:
1 starView = [[WQLStarView alloc]initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, 40) withTotalStar:5 withTotalPoint:10 starSpace:10]; 2 3 starView.starAliment = StarAlimentCenter; 4 5 starView.commentPoint = 7; 6 7 [self.view addSubview:starView];
这个starAliment是个什么属性?下文会提到。
再看看此时效果:
好了,接下来,看一下我们的核心文件了:
WQLStarView.h
1 typedef NS_ENUM(NSInteger,StarAliment) { 2 StarAlimentDefault, 3 StarAlimentCenter, 4 StarAlimentRight 5 }; 6 7 8 @interface WQLStarView : UIView 9 /** 10 * 评分 11 */ 12 @property (nonatomic,assign) CGFloat commentPoint; 13 /** 14 * 对齐方式 15 */ 16 @property (nonatomic,assign) StarAliment starAliment; 17 18 /** 19 * 初始化方法 20 * 21 * @param frame 整个星星视图的frame 22 * @param totalStar 总的星星的个数 23 * @param totalPoint 星星表示的总分数 24 * @param space 星星之间的间距 25 * 26 * @return WQLStarView 27 */ 28 - (instancetype)initWithFrame:(CGRect)frame withTotalStar:(NSInteger)totalStar withTotalPoint:(CGFloat)totalPoint starSpace:(NSInteger)space;
关键是WQLStarView.m文件了:
初始化方法:
1 - (instancetype)initWithFrame:(CGRect)frame withTotalStar:(NSInteger)totalStar withTotalPoint:(CGFloat)totalPoint starSpace:(NSInteger)space 2 { 3 self = [super initWithFrame:frame]; 4 if (self) { 5 6 //对传进来的frame进行处理,取合适的星星的高度 7 8 //传进来的高度 9 CGFloat height = frame.size.height; 10 //减去间距后的平均的宽度(我设置的星星 高度=宽度) 11 CGFloat averageHeight = (frame.size.width-space*(totalStar-1))/totalStar; 12 13 if (height>averageHeight) { 14 starHeight = averageHeight; 15 }else{ 16 starHeight = height; 17 } 18 19 starBaseTag = 6666; 20 spaceWidth = space; 21 totalNumber = totalStar; 22 singlePoint = totalPoint/totalStar; 23 maxPoints = totalPoint; 24 25 [self loadCustomViewWithTotal:totalStar]; 26 27 } 28 return self; 29 }
加载视图:
1 - (void)loadCustomViewWithTotal:(NSInteger)totalStar 2 { 3 //先铺背景图片(空的星星) 4 for (int i =0 ; i<totalStar; i++) { 5 UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(i*starHeight+i*spaceWidth, self.frame.size.height-starHeight, starHeight, starHeight)]; 6 imageView.tag = starBaseTag+i; 7 imageView.image = [UIImage imageNamed:@"starBackImage"]; 8 [self addSubview:imageView]; 9 } 10 11 }
设置评分分数:
1 //当你设置评分时 开始填充整颗星星 2 - (void)setCommentPoint:(CGFloat)commentPoint 3 { 4 _commentPoint = commentPoint; 5 6 if (commentPoint > maxPoints) { 7 commentPoint = maxPoints; 8 } 9 10 CGFloat showNumber = commentPoint/singlePoint; 11 12 //覆盖的长图 13 if (!starView) { 14 starView = [[UIView alloc]init]; 15 } 16 17 starView.frame = CGRectZero; 18 //整颗星星 19 NSInteger fullNumber = showNumber/1; 20 21 if (starOffset > 0) { 22 starView.frame = CGRectMake(starOffset, self.frame.size.height-starHeight, starHeight*showNumber+spaceWidth*fullNumber, starHeight); 23 24 }else{ 25 starView.frame = CGRectMake(0, self.frame.size.height-starHeight, starHeight*showNumber+spaceWidth*fullNumber, starHeight); 26 27 } 28 starView.clipsToBounds = YES; 29 30 //在长图上填充完整的星星 31 for (int j = 0; j< fullNumber; j++) { 32 UIImageView *starImageView = [[UIImageView alloc]init]; 33 starImageView.image = [UIImage imageNamed:@"starImage"]; 34 starImageView.frame = CGRectMake(j*starHeight+j*spaceWidth, 0, starHeight, starHeight); 35 [starView addSubview:starImageView]; 36 } 37 38 CGFloat part = showNumber - fullNumber; 39 //如果有残缺的星星 则添加 40 if (part > 0) { 41 UIImageView *partImage = [[UIImageView alloc]initWithFrame:CGRectMake(fullNumber*starHeight+fullNumber*spaceWidth, 0, starHeight, starHeight)]; 42 partImage.image = [UIImage imageNamed:@"starImage"]; 43 [starView addSubview:partImage]; 44 } 45 46 [self addSubview:starView]; 47 }
设置对齐方式:
1 //设置星星的对齐方式 2 - (void)setStarAliment:(StarAliment)starAliment 3 { 4 _starAliment = starAliment; 5 6 switch (starAliment) { 7 //居中对齐 8 case StarAlimentCenter: 9 { 10 CGFloat starRealWidth = totalNumber*starHeight+(totalNumber-1)*spaceWidth; 11 CGFloat leftWidth = self.frame.size.width-starRealWidth; 12 13 for (int i =0 ; i< totalNumber; i++) { 14 UIImageView *starImageView = (UIImageView*)[self viewWithTag:i+starBaseTag]; 15 starImageView.frame = CGRectMake(leftWidth/2+starImageView.frame.origin.x, starImageView.frame.origin.y, starImageView.frame.size.width, starImageView.frame.size.height); 16 } 17 starOffset = leftWidth/2; 18 starView.frame = CGRectMake(leftWidth/2+starView.frame.origin.x, starView.frame.origin.y, starView.frame.size.width, starView.frame.size.height); 19 20 } 21 break; 22 //右对齐 23 case StarAlimentRight: 24 { 25 CGFloat starRealWidth = totalNumber*starHeight+(totalNumber-1)*spaceWidth; 26 CGFloat leftWidth = self.frame.size.width-starRealWidth; 27 28 for (int i =0 ; i< totalNumber; i++) { 29 UIImageView *starImageView = (UIImageView*)[self viewWithTag:i+starBaseTag]; 30 starImageView.frame = CGRectMake(leftWidth+starImageView.frame.origin.x, starImageView.frame.origin.y, starImageView.frame.size.width, starImageView.frame.size.height); 31 } 32 starOffset = leftWidth; 33 starView.frame = CGRectMake(leftWidth+starView.frame.origin.x, starView.frame.origin.y, starView.frame.size.width, starView.frame.size.height); 34 35 } 36 break; 37 //默认的左对齐 38 case StarAlimentDefault: 39 { 40 41 for (int i =0 ; i< totalNumber; i++) { 42 UIImageView *starImageView = (UIImageView*)[self viewWithTag:i+starBaseTag]; 43 starImageView.frame = CGRectMake(i*starHeight+i*spaceWidth, self.frame.size.height-starHeight, starHeight, starHeight); 44 } 45 46 47 CGFloat showNumber = self.commentPoint/singlePoint; 48 49 //整颗星星 50 NSInteger fullNumber = showNumber/1; 51 starOffset = 0; 52 starView.frame = CGRectMake(0, self.frame.size.height-starHeight, starHeight*showNumber+spaceWidth*fullNumber, starHeight); 53 54 55 } 56 break; 57 default: 58 { 59 60 } 61 break; 62 } 63 64 65 }
至此,已经完成了星星视图的实现了。
感兴趣的朋友们可以下载看一下:https://github.com/Coolll/WQLStarView
此外,如有不足,请各位大神多多指出来~小的感激不尽~~
</div>