IOS 开发中画扇形图实例详解
发布时间 - 2026-01-11 00:52:05 点击率:次IOS 开发中画扇形图实例详解

昨天在做项目中,遇到一个需要显示扇形图的功能,网上搜了一下,发现code4app里面也没有找到我想要的那种类似的效果,没办法了,只能自己学习一下如何画了。
首先我们需要了解一个uiview的方法
-(void)drawRect:(CGRect)rect
我们知道了这个方法,就可以在自定义UIView的子类的- (void)drawRect:(CGRect)rect里面绘图了,关于drawrect的调用周期,网上也是一找一大堆,等下我会整理一下,转载一篇供你们参考。
废话少说,下面直接开始代码
首先我们自定义一个继承字uiview的子类,我这里就起名字叫pieview了
首先我们试试先画一个圆
#import "pieview.h"
//直径,其实radius是半径的意思吧,哈哈 算了先用着,demo都写好了就不改了,你们知道就行了
#define radius 50
@implementation pieview
-(void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();//获取图形上下文
CGPoint cent=CGPointMake((self.frame.size.width/2)-radius/2, (self.frame.size.height/2)-radius/2);//设置图形开始画的坐标原点,根据实际需要设置,我这是随便写的
CGContextAddEllipseInRect(ctx, CGRectMake(cent.x, cent.y, 100, 100));这个是核心函数,在这里设置图形的开始从哪里画,画的宽度和高度是多少。如果宽高不一样 可就是椭圆了啊
[[UIColor greenColor] set];//设置颜色
CGContextFillPath(ctx);//实心的
//CGContextStrokePath(ctx);空心的
}
@end
然后我们创建一个控制器 pieViewController 引用我们的pieview,展示一下效果
#import "pieViewController.h"
//#import "myview.h"
//#import "JYpieview.h"
#import "pieview.h"
@interface pieViewController ()
@end
@implementation pieViewController
- (void)viewDidLoad {
[super viewDidLoad];
pieview *view=[[pieview alloc]init];
view.frame=CGRectMake(4, 150, 150, 300);
[self.view addSubview:view];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
好了看一下效果吧
好了,下面让我们开始扇形图的制作吧
#import "pieview.h"
//直径
#define radius 50
#define PI 3.14159265358979323846
@implementation pieview
//计算度转弧度
static inline float radians(double degrees) {
return degrees * PI / 180;
}
-(void)drawRect:(CGRect)rect
{
CGPoint cent=CGPointMake((self.frame.size.width/2)-radius/2, (self.frame.size.height/2)-radius/2);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextClearRect(ctx, rect);
float angle_start = radians(0.0);
float angle_end = radians(120.0);
CGContextMoveToPoint(ctx, cent.x, cent.y);
CGContextSetFillColor(ctx, CGColorGetComponents( [[UIColor greenColor] CGColor]));
CGContextAddArc(ctx, cent.x, cent.y, radius, angle_start, angle_end, 0);
CGContextFillPath(ctx);
angle_start = angle_end;
angle_end = radians(360.0);
CGContextMoveToPoint(ctx, cent.x, cent.y);
CGContextSetFillColor(ctx, CGColorGetComponents( [[UIColor blueColor] CGColor]));
CGContextAddArc(ctx, cent.x, cent.y, radius, angle_start, angle_end, 0);
CGContextFillPath(ctx);
}
@end
在运行一下,我们看下效果
可使有没有觉得上面的代码很多重复的?对的,我们可以封装一个方法 那么重构后的代码我就一次性的贴上去了
#import "pieview.h"
//直径
#define radius 50
#define PI 3.14159265358979323846
@implementation pieview
//计算度转弧度
static inline float radians(double degrees) {
return degrees * PI / 180;
}
static inline void drawArc(CGContextRef ctx, CGPoint point, float angle_start, float angle_end, UIColor* color) {
CGContextMoveToPoint(ctx, point.x, point.y);
CGContextSetFillColor(ctx, CGColorGetComponents( [color CGColor]));
CGContextAddArc(ctx, point.x, point.y, radius, angle_start, angle_end, 0);
//CGContextClosePath(ctx);
CGContextFillPath(ctx);
}
-(void)drawRect:(CGRect)rect
{
CGPoint cent=CGPointMake((self.frame.size.width/2)-radius/2, (self.frame.size.height/2)-radius/2);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextClearRect(ctx, rect);
float angle_start = radians(0.0);
float angle_end = radians(121.0);
drawArc(ctx, cent, angle_start, angle_end, [UIColor yellowColor]);
angle_start = angle_end;
angle_end = radians(228.0);
drawArc(ctx, cent, angle_start, angle_end, [UIColor greenColor]);
angle_start = angle_end;
angle_end = radians(260);
drawArc(ctx, cent, angle_start, angle_end, [UIColor orangeColor]);
angle_start = angle_end;
angle_end = radians(360);
drawArc(ctx, cent, angle_start, angle_end, [UIColor purpleColor]);
}
@end
看下运行效果图
如果我们中途数据变了 想要改一下图形怎么办呢?
那么我们就需要用到这个
//通知自定义的view重新绘制图形 // [self setNeedsDisplay];
这时候我们就要pieview向外界提供一个接口属性,这是我做的模拟5面之后改变圆形的直径大小
.h文件
#import <UIKit/UIKit.h> @interface pieview : UIView //直径 @property(nonatomic,assign)float radius; @end
.m文件
#import "pieview.h"
#define PI 3.14159265358979323846
@implementation pieview
//计算度转弧度
static inline float radians(double degrees) {
return degrees * PI / 180;
}
static inline void drawArc(CGContextRef ctx, CGPoint point, float angle_start, float angle_end, UIColor* color,float radius) {
CGContextMoveToPoint(ctx, point.x, point.y);
CGContextSetFillColor(ctx, CGColorGetComponents( [color CGColor]));
CGContextAddArc(ctx, point.x, point.y, radius, angle_start, angle_end, 0);
//CGContextClosePath(ctx);
CGContextFillPath(ctx);
}
-(void)drawRect:(CGRect)rect
{
CGPoint cent=CGPointMake((self.frame.size.width/2)-self.radius/2, (self.frame.size.height/2)-self.radius/2);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextClearRect(ctx, rect);
float angle_start = radians(0.0);
float angle_end = radians(121.0);
drawArc(ctx, cent, angle_start, angle_end, [UIColor yellowColor],self.radius);
angle_start = angle_end;
angle_end = radians(228.0);
drawArc(ctx, cent, angle_start, angle_end, [UIColor greenColor],self.radius);
angle_start = angle_end;
angle_end = radians(260);
drawArc(ctx, cent, angle_start, angle_end, [UIColor orangeColor],self.radius);
angle_start = angle_end;
angle_end = radians(360);
drawArc(ctx, cent, angle_start, angle_end, [UIColor purpleColor],self.radius);
}
-(void)setRadius:(float)radius
{
_radius=radius;
[self setNeedsDisplay];
}
@end
pieViewController.m文件
@implementation pieViewController
- (void)viewDidLoad {
[super viewDidLoad];
pieview *view=[[pieview alloc]init];
view.radius=50;
view.frame=CGRectMake(4, 150, 150, 300);
[self.view addSubview:view];
//view.backgroundColor=[UIColor clearColor];
//模拟5秒后执行这个段代码
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
view.radius=20;
});
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
效果
5秒之后
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# ios开发中如何画扇形图
# IOS
# 扇形图
# 画扇形图
# iOS画出精美的图表方法示例
# iOS App开发中用CGContextRef绘制基本图形的基本示例
# iOS新增绘制圆的方法实例代码
# iOS使用Charts框架绘制饼状图
# iOS使用Charts框架绘制折线图
# IOS绘制虚线的方法总结
# iOS绘制专属于程序猿的浪漫爱心
# IOS绘制动画颜色渐变折线条
# iOS开发中使用Quartz2D绘图及自定义UIImageView控件
# iOS开发CGContextRef画图使用总结
# 好了
# 自定义
# 这是
# 子类
# 我就
# 在这里
# 我会
# 去了
# 让我们
# 就不
# 网上
# 我们可以
# 没办法
# 希望能
# 我做
# 看一下
# 谢谢大家
# 可使
# 提供一个
# 没有找到
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
如何快速查询网址的建站时间与历史轨迹?
Android自定义listview布局实现上拉加载下拉刷新功能
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
IOS倒计时设置UIButton标题title的抖动问题
Laravel怎么使用artisan命令缓存配置和视图
如何用PHP快速搭建CMS系统?
Android 常见的图片加载框架详细介绍
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
个人摄影网站制作流程,摄影爱好者都去什么网站?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
长沙做网站要多少钱,长沙国安网络怎么样?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何用AWS免费套餐快速搭建高效网站?
如何快速生成ASP一键建站模板并优化安全性?
Laravel如何使用Gate和Policy进行授权?(权限控制)
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
微信h5制作网站有哪些,免费微信H5页面制作工具?
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
Laravel如何处理文件下载请求?(Response示例)
在Oracle关闭情况下如何修改spfile的参数
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
Laravel如何使用Blade模板引擎?(完整语法和示例)
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
如何快速搭建虚拟主机网站?新手必看指南
在线教育网站制作平台,山西立德教育官网?
千库网官网入口推荐 千库网设计创意平台入口
无锡营销型网站制作公司,无锡网选车牌流程?
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)
java ZXing生成二维码及条码实例分享
图册素材网站设计制作软件,图册的导出方式有几种?
JavaScript如何实现倒计时_时间函数如何精确控制
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
Laravel怎么使用Intervention Image库处理图片上传和缩放
如何在万网主机上快速搭建网站?
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
上一篇:pepe币2025年价格预测
上一篇:pepe币2025年价格预测

