#import "PieView.h"

@implementation PieView

- (void)drawRect:(CGRect)rect {
// Drawing code NSArray *dataArray = @[@,@,@];
CGPoint center = CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5);
CGFloat radius = self.bounds.size.width * 0.5 - ;
CGFloat startA = ;
CGFloat angle = ;
CGFloat endA = ; for (NSNumber *num in dataArray) { startA = endA;
angle = num.intValue / 100.0 * M_PI * ;
endA = startA + angle;
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startA endAngle:endA clockwise:YES];
[[self randomColor] set];
//添加一根线到圆心
[path addLineToPoint:center];
[path fill];
} } -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //重绘:1:drawRect方法不能手动去调用,否则不会自动生成与view有关的图形上下文 2:手动调用setNeedsDisplay,则系统会自动调用drawRect重绘,只要是系统自动调用的drawRect,都会自动生成与图形相关的上下文,fill,strokn都默认执行了绘图的几个步骤,要想实现绘图,需要自定义view,实现drawRect方法
[self setNeedsDisplay];
} //生成一个随机的颜色
- (UIColor *)randomColor { //arc4random_uniform:生成的随机数,范围为256,则生成的随机数范围是 0 -255
CGFloat r = arc4random_uniform() / 255.0;
CGFloat g = arc4random_uniform() / 255.0;
CGFloat b = arc4random_uniform() / 255.0; return [UIColor colorWithRed:r green:g blue:b alpha:];
} - (void)drawPie{
//画第一个扇形
CGPoint center = CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5);
CGFloat radius = self.bounds.size.width * 0.5 - ;
CGFloat startA = ;
CGFloat angle = / 100.0 * M_PI * ;//当计算除法的时候,若是用浮点数CGFloat修饰,就要除以一个100.0,后面有小数
CGFloat endA = startA + angle; UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startA endAngle:endA clockwise:YES]; [[UIColor redColor] set];
//添加一根线到圆心
[path addLineToPoint:center];
[path fill];//调用的stroken描点或是fill填充都默认开启了图形上下文,绘制路径,把路径添加到图形上下文中,将图形上下文渲染到view上,其中调用fill,会自动添加一条线形成闭环 //画第二个扇形 startA = endA;
angle = / 100.0 * M_PI * ;
endA = startA + angle;
path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startA endAngle:endA clockwise:YES];
[[UIColor greenColor] set];
//添加一根线到圆心
[path addLineToPoint:center];
[path fill]; startA = endA;
angle = / 100.0 * M_PI * ;
endA = startA + angle;
path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startA endAngle:endA clockwise:YES];
[[UIColor blueColor] set];
//添加一根线到圆心
[path addLineToPoint:center];
[path fill]; } @end

第一步, 获取上下文

第二步,拼接路径 ,绘制第一个扇形

获取上下文

CGContextRef ctx =  UIGraphicsGetCurrentContext();

CGPoint center = CGPointMake(125, 125);

CGFloat radius = 100;

CGFloat startA = 0;

CGFloat endA = 0;

CGFloat angle = 25 / 100.0 * M_PI * 2;

endA = startA + angle;

拼接路径

UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center

radius:radius

startAngle:startA

endAngle:endA

clockwise:YES];

添加一根线到圆心

[path addLineToPoint:center];

把路径添加到上下文

CGContextAddPath(ctx, path.CGPath);

把上下文渲染到View

CGContextFillPath(ctx);

注意点: CGFloat angle = 25 / 100.0 * M_PI * 2;

100.0一定要加一个.0

绘制第二个扇形

一样的, 把路径描述第二个扇形就好了

直接来个path =

让Path指针重新指向一个新的对象.也就是把指针重复利用了

之前的那个对象已经用完了,已经添加到了上下文当中了.

第二个扇形

startA = endA;

angle = 25 / 100.0 * M_PI * 2;

endA = startA + angle;

path = [UIBezierPath bezierPathWithArcCenter:center

radius:radius

startAngle:startA

endAngle:endA

clockwise:YES];

[path addLineToPoint:center];

把二个路径添加到上下文

CGContextAddPath(ctx, path.CGPath);

把上下文渲染到View

CGContextFillPath(ctx);

添加第二个扇形之后, 发现它们的颜色都一样,想要修改它的颜色

在下面再写一个

[[UIColor greenColor] set];

下面的一个颜色把之前的东西给覆盖了.

解决办法, 让它渲染两次

第三个扇形,把第二个拷贝一下就好了

总结:

有没有发现在画三个扇形用太多代码了,

里面有很多代码相似.

是不是可以把代码给抽一下

可以用便利数组的的方式

发现就两个地方变了, 一个数字变了, 一个颜色变了.

抽取代码:

假设他给一组数据

NSArray datas =  @[@25,@25,@50];

把数组便利出来

NSArray *datas =  @[@25,@25,@50];

CGPoint center = CGPointMake(125, 125);

CGFloat radius = 100;

CGFloat startA = 0;

CGFloat angle = 0;

CGFloat endA = 0;

for (NSNumber *number in datas) {

startA = endA;

angle = number.intValue / 100.0 * M_PI * 2;

endA = startA + angle;

描述路径

UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center

radius:radius

startAngle:startA

endAngle:endA

clockwise:YES];

[path addLineToPoint:center];

[[self randomColor] set];

[path fill];

}

- (UIColor *)randomColor{

CGFloat r = arc4random_uniform(256)/ 255.0;

CGFloat g = arc4random_uniform(256)/ 255.0;

CGFloat b = arc4random_uniform(256)/ 255.0;

return [UIColor colorWithRed:r green:g blue:b alpha:1];

}

随机颜色:alpha通道它的取值范围是0-255;

OC里面的取值范围只能是0到1,把它 / 255.0就让它到这个范围了,

arc4random_uniform(256)随机产生 0 - 255的数.

颜色通道它的取值范围是0 到 255.

所以说要把0 到 255转换成0 到 1

直接是  0 ~ 255 / 255.0就可以了.

刚好是255就是255 / 255.0 就是1,

刚才是0 就是 0 / 255.0 就是0.

ios开发之Quartz2D 四:画饼图的更多相关文章

  1. iOS开发之Quartz2D 五:UIKIT 绘图演练,画文字,画图片

    #import "DrawView.h" @implementation DrawView -(void)awakeFromNib { // //画图片 // UIImage *i ...

  2. iOS开发之Quartz2D详解

    1. 什么是Quartz2D? Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片( ...

  3. iOS开发之Quartz2D

    1.         Quartz2D概述及作用 Quartz2D的API是纯C语言的,Quartz2D的API来自于Core Graphics框架. 数据类型和函数基本都以CG作为前缀,比如: CG ...

  4. iOS开发之Quartz2D 六 绘制UIImageView

    #import <UIKit/UIKit.h> @interface XMGImageView : UIView /** <#注释#> */ @property (nonato ...

  5. iOS开发之Quartz2D 二:绘制直线,曲线,圆弧,矩形,椭圆,圆

    #import "DrawView.h" @implementation DrawView /** * 作用:专门用来绘图 * 什么时候调用:当View显示的时候调用 * @par ...

  6. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  7. iOS开发之loadView、viewDidLoad及viewDidUnload的关系

    iOS开发之loadView.viewDidLoad及viewDidUnload的关系 iOS开发之loadView.viewDidLoad及viewDidUnload的关系    标题中所说的3个方 ...

  8. iOS开发之Xcode常用调试技巧总结

    转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...

  9. iOS 开发之 GCD 基础

    header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em} .markdown-body{overflow:hidden} .markdo ...

随机推荐

  1. python实现获取文件列表中每一个文件keyword

    功能描写叙述: 获取某个路径下的全部文件,提取出每一个文件里出现频率最高的前300个字.保存在数据库其中. 前提.你须要配置好nltk #!/usr/bin/python #coding=utf-8 ...

  2. 6lession-基本数据类型

    因为自己是根据网上教程学习的,所以以下内容参考自 http://www.w3cschool.cc/python/python-variable-types.html python支持物种数据类型,分别 ...

  3. Java学习笔记五 常用API对象一

    常用API:字符串操作:String类,StringBuffer类,StringBulider类 字符串是最重要的数据类型之一,处理字符串也是一种语言的基本工作. 1.String类: public ...

  4. 随手记录---transform 属性

    其实平时很少用到transform属性,一些放大缩小用width.height可以改变,一些位置变换,更是有margin,而一些旋转.2D.3D变换也不怎么能用得到.不过最近接触了一些图片的缩放,觉得 ...

  5. C语言的多行宏定义

    一.多行宏定义的使用 最近在跟STM32L011K4T6低功耗的源代码,发现使用了多行的宏定义来封装函数,记得之前把\给删除掉,编译程序就一直报错. \是续行操作符,也就是宏定义一行写不完,需要多行写 ...

  6. 设计模式六大原则(四):接口隔离原则(Interface Segregation Principle)

    接口隔离原则(ISP)定义: 客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 问题由来: 类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不 ...

  7. android对话框(Dialog)的使用方法

    Activities提供了一种方便管理的创建.保存.回复的对话框机制.比如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog( ...

  8. javascript进阶教程第二章对象案例实战

    javascript进阶教程第二章对象案例实战 一.学习任务 通过几个案例练习回顾学过的知识 通过案例练习补充几个之前没有见到或者虽然讲过单是讲的不仔细的知识点. 二.具体实例 温馨提示 面向对象的知 ...

  9. css实现水波纹效果

    1. HTML 代码: <div class="example"> <div class="dot"></div> < ...

  10. python3中让程序暂停运行的语句

    https://blog.csdn.net/zmz971751504/article/details/78288988