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事务操作确保数据一致性