iOS上下文实现评价星星示例代码
发布时间 - 2026-01-11 00:25:54 点击率:次常规思路:

创建两个 view,通过 for 循环创建 imageView,未点亮星星视图在下、点亮星星视图在上重合在一起,当用户点击视图时,通过改变点亮星星视图的 width 实现功能
本文思路:
直接重写 drawrect 方法,在 drawrect 用 drawimage 画出星星,根据 currentValue 画出不同类型的星星,当用户点击视图时,改变 currentValue,并根据改变后的 currentValue 重新画出星星。
展示图:
代码:
自定义一个继承 UIView 的 CYStarView
属性:
/** 完成后执行的block */ @property (copy, nonatomic) void(^completionBlock)(NSInteger); /** 是否可以点击 */ @property (assign, nonatomic) BOOL clickable; /** 星星个数 */ @property (assign, nonatomic) NSInteger numberOfStars; /** 星星边长 */ @property (assign, nonatomic) CGFloat lengthOfSide; /** 评价值 */ @property (assign, nonatomic) NSInteger currentValue; /** 星星间隔 */ @property (assign, nonatomic) CGFloat spacing;
重写 setter 方法,在 setter 方法中调用 setNeedsDisplay,会执行 drawrect:
- (void)setLengthOfSide:(CGFloat)lengthOfSide {
// 超过控件高度
if (lengthOfSide > self.frame.size.height) {
lengthOfSide = self.frame.size.height;
}
// 超过控件宽度
if (lengthOfSide > self.frame.size.width / _numberOfStars) {
lengthOfSide = self.frame.size.width / _numberOfStars;
}
_lengthOfSide = lengthOfSide;
_spacing = (self.frame.size.width - lengthOfSide * _numberOfStars) / _numberOfStars;
[self setNeedsDisplay];
}
在 drawrect 中画星星:
- (void)drawRect:(CGRect)rect {
UIImage *lightImage = [UIImage imageNamed:@"star_light"];
UIImage *darkImage = [UIImage imageNamed:@"star_dark"];
// 获取当前上下文
CGContextRef context = UIGraphicsGetCurrentContext();
for (int i = 0; i < self.numberOfStars; i ++) {
// 根据 currentValue 选择是画亮的还是暗的星星
UIImage *image = i >= self.currentValue ? darkImage : lightImage;
CGRect imageRect = CGRectMake(self.spacing / 2 + (self.lengthOfSide + self.spacing) * i, (self.frame.size.height - self.lengthOfSide) / 2, self.lengthOfSide, self.lengthOfSide);
CGContextSaveGState(context);
// 坐标系Y轴是相反的,进行翻转
CGContextScaleCTM(context, 1.0, - 1.0);
CGContextTranslateCTM(context, 0, - rect.origin.y * 2 - rect.size.height);
CGContextDrawImage(context, imageRect, image.CGImage);
CGContextRestoreGState(context);
}
}
使用:
在要使用的控制器中:
#import "CYStarView.h"
// 初始化,传入必要参数
CYStarView *starView = [[CYStarView alloc] initWithFrame:frame numberOfStars:number lengthOfSide:length];
// 设置 clickable,评论界面设置为YES,展示界面设置为NO
self.starView.clickable = YES;
//
// 设置 completionBlock
self.starView.completionBlock = ^(NSInteger currentValue) {
// 点击后的操作放这里
};
项目地址:点我点我!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# ios
# 评价星星
# 实现评价小星星
# 评价星星如何实现
# iOS评分(评价)星星图打分功能
# iOS实现支持小数的星星评分组件实例代码
# 画出
# 重写
# 设置为
# 自定义
# 在上
# 我点
# 要使
# 不同类型
# 大家多多
# 器中
# 完成后
# assign
# BOOL
# clickable
# NSInteger
# void
# completionBlock
# nonatomic
# numberOfStars
# spacing
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
iOS发送验证码倒计时应用
如何挑选高效建站主机与优质域名?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
如何在宝塔面板中创建新站点?
在centOS 7安装mysql 5.7的详细教程
如何构建满足综合性能需求的优质建站方案?
Laravel如何使用Eloquent进行子查询
Android 常见的图片加载框架详细介绍
油猴 教程,油猴搜脚本为什么会网页无法显示?
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
如何有效防御Web建站篡改攻击?
如何在阿里云服务器自主搭建网站?
Laravel如何发送系统通知?(Notification渠道示例)
如何在万网开始建站?分步指南解析
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
Laravel如何实现事件和监听器?(Event & Listener实战)
如何挑选最适合建站的高性能VPS主机?
如何在橙子建站中快速调整背景颜色?
如何破解联通资金短缺导致的基站建设难题?
jQuery中的100个技巧汇总
浅析上传头像示例及其注意事项
Linux网络带宽限制_tc配置实践解析【教程】
iOS中将个别页面强制横屏其他页面竖屏
如何快速上传自定义模板至建站之星?
PHP 500报错的快速解决方法
Python文本处理实践_日志清洗解析【指导】
Laravel如何使用withoutEvents方法临时禁用模型事件
如何在建站之星绑定自定义域名?
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
Firefox Developer Edition开发者版本入口
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
QQ浏览器网页版登录入口 个人中心在线进入
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
如何快速搭建高效服务器建站系统?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
如何批量查询域名的建站时间记录?
Python数据仓库与ETL构建实战_Airflow调度流程详解
如何在腾讯云服务器快速搭建个人网站?
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
Linux系统运维自动化项目教程_Ansible批量管理实战
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性

