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队列使用教程