全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

IOS 开发中画扇形图实例详解

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画图使用总结  # 好了  # 自定义  # 这是  # 子类  # 我就  # 在这里  # 我会  # 去了  # 让我们  # 就不  # 网上  # 我们可以  # 没办法  # 希望能  # 我做  # 看一下  # 谢谢大家  # 可使  # 提供一个  # 没有找到 


相关文章: 建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  小建面朝正北,A点实际方位是否存在偏差?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  活动邀请函制作网站有哪些,活动邀请函文案?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  宝塔Windows建站如何避免显示默认IIS页面?  建站之星伪静态规则如何设置?  建站之星代理如何获取技术支持?  如何在Windows服务器上快速搭建网站?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  北京网站制作公司哪家好一点,北京租房网站有哪些?  深入理解Android中的xmlns:tools属性  如何快速搭建高效服务器建站系统?  成都网站制作报价公司,成都工业用气开户费用?  如何通过多用户协作模板快速搭建高效企业网站?  怎么将XML数据可视化 D3.js加载XML  如何高效完成自助建站业务培训?  如何在阿里云虚拟服务器快速搭建网站?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  子杰智能建站系统|零代码开发与AI生成SEO优化指南  实现虚拟支付需哪些建站技术支撑?  网站制作软件有哪些,制图软件有哪些?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  php json中文编码为null的解决办法  网站制作知乎推荐,想做自己的网站用什么工具比较好?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  建站主机如何安装配置?新手必看操作指南  公司门户网站制作流程,华为官网怎么做?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  学校建站服务器如何选型才能满足性能需求?  开封网站制作公司,网络用语开封是什么意思?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  建站10G流量真的够用吗?如何应对访问高峰?  公司网站的制作公司,企业网站制作基本流程有哪些?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  长沙企业网站制作哪家好,长沙水业集团官方网站?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  ,网页ppt怎么弄成自己的ppt?  如何批量查询域名的建站时间记录?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  在线教育网站制作平台,山西立德教育官网?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  东莞专业制作网站的公司,东莞大学生网的网址是什么?  javascript基本数据类型及类型检测常用方法小结 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。