实现核心

1.压缩饼图,使饼图有3D的效果,并不是真正的画了个3D圆柱
2.绘制厚度,带阴影效果,让看上去像是圆柱的高
3.路径添加好了,用颜色填充后绘制一下,添加阴影后还需绘制一遍
饼图添加阴影的思考
之前这加阴影的一段不是很明白,为啥设颜色和阴影都要draw一次
进过反复的测试,我自己分析了一下,每次draw一下想当于,把当前的设置画出来,再次draw就在这基础上,再画最近的设置,这里加颜色和阴影就像是一层一层的画上去。要是不draw的话,再设置颜色相当于重新设置了颜色,之前设置的颜色就无效了。同时要结合path使用,如果设置一场颜色draw一次,再设置颜色draw一次,后面设置的颜色是无用的。需要添加阴影的部分,需要用path路径绘制。
效果图
3D饼图的核心代码如下:
#import "SSSolidCakeView.h"
@implementation SSSolidCakeView
#pragma mark 重写绘制方法
- (void)drawRect:(CGRect)rect
{
//第一步获得上下文
CGContextRef cakeContextRef = UIGraphicsGetCurrentContext();
//反锯齿,让图形边缘更加柔和(Sets whether or not to allow anti-aliasing for a graphics context.)
CGContextSetAllowsAntialiasing(cakeContextRef, TRUE);
//缩放坐标系的比例,通过设置y轴压缩,然后画代阴影的厚度,就画出了像是3D饼图的效果
CGContextScaleCTM(cakeContextRef, _xScale, _yScale);
//饼图最先的起始角度
CGFloat startAngle =0;
for (int i = 0; i<_dataArray.count; i++) {
//画饼的横截面,上一部分完整的圆
//cake当前的角度
CGFloat currentAngle = [_dataArray[i] floatValue];
//结束的角度
CGFloat endAngle = startAngle + currentAngle;
//每一块cake的起点,也就是圆心
CGContextMoveToPoint(cakeContextRef, _cakeCenter.x, _cakeCenter.y);
//添加对应角度扇形
CGContextAddArc(cakeContextRef, _cakeCenter.x, _cakeCenter.y, _cakeRadius, startAngle*M_PI*2, endAngle*M_PI*2, 0);
//得到对应的颜色
UIColor *currentColor = _colorArray[i];
//设置边界颜色
CGContextSetStrokeColorWithColor(cakeContextRef, currentColor.CGColor);
//设置填充颜色
CGContextSetFillColorWithColor(cakeContextRef, currentColor.CGColor);
//画子路径,这里就绘制还不是在画完厚度再绘制,是因为并不需要绘制所有cake的厚度,但是上一部分的圆是都要绘制的
CGContextDrawPath(cakeContextRef, kCGPathFill);
//饼图上一部分圆,startAngle处的起点坐标
CGFloat upStartX = _cakeCenter.x+_cakeRadius*cos(startAngle*2*M_PI);
CGFloat upStartY = _cakeCenter.y+_cakeRadius*sin(startAngle*2*M_PI);
//饼图上一部分圆,endAngle处的终点坐标
CGFloat upEndX = _cakeCenter.x+_cakeRadius*cos(endAngle*2*M_PI);
CGFloat upEndY = _cakeCenter.y+_cakeRadius*sin(endAngle*2*M_PI);
//饼图厚度在角度结束处y坐标
CGFloat downEndY = upEndY + _cakeHeight;
//画圆柱的侧面,饼图的厚度,圆柱的前半部分能看到,后半部分是看不到
//开始的角度如果>=M_PI,就会在圆柱的后面,侧面厚度就没必要画了
if (startAngle<0.5) {
//绘制厚度
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, nil, upStartX, upStartY);
//当结束的角度>0.5*2*M_PI时,结束的角度该是M_PI的地方(视觉原因)
if (endAngle>0.5) {
//上部分的弧
CGPathAddArc(path, nil, _cakeCenter.x, _cakeCenter.y, _cakeRadius, startAngle*2*M_PI, M_PI, 0);
//在角度结束的地方,上部分到下部分的直线
CGPathAddLineToPoint(path, nil, _cakeCenter.x-_cakeRadius, _cakeCenter.y+_cakeHeight);
//下部分的弧
CGPathAddArc(path, nil, _cakeCenter.x, _cakeCenter.y + _cakeHeight, _cakeRadius, M_PI, startAngle*2*M_PI, 1);
//在角度开始的地方,从下部分到上部分的直线
CGPathAddLineToPoint(path, nil, upStartX, upStartY);
}
else{
//上部分的弧
CGPathAddArc(path, nil, _cakeCenter.x, _cakeCenter.y, _cakeRadius, startAngle*2*M_PI, endAngle*2*M_PI, 0);
//在角度结束的地方,上部分到下部分的直线
CGPathAddLineToPoint(path, nil, upEndX, downEndY);
//下部分的弧
CGPathAddArc(path, nil, _cakeCenter.x, _cakeCenter.y + _cakeHeight, _cakeRadius, endAngle*2*M_PI, startAngle*2*M_PI, 1);
//在角度开始的地方,从下部分到上部分的直线
CGPathAddLineToPoint(path, nil, upStartX, upStartY);
}
//之前这一段不是很明白,为啥设颜色和阴影都要draw一次
//我自己尝试并理解分析了一下,每次draw一下想当于,把当前的设置画出来,再次draw就在这基础上,再画当前的设置,这里加颜色和阴影就是一层一层的画上去。要是不draw的话,再设置颜色相当于重新设置了颜色,之前设置的颜色就无效了。
CGContextAddPath(cakeContextRef, path);
CGContextDrawPath(cakeContextRef, kCGPathFill);
//加阴影
[[UIColor colorWithWhite:0.2 alpha:0.4] setFill];
CGContextAddPath(cakeContextRef, path);
CGContextDrawPath(cakeContextRef, kCGPathFill);
}
//最后一句,上一块的结束角度是下一块的开始角度
startAngle = endAngle;
}
//此时不能用以下的方法填充,会导致饼图就一种颜色
//CGContextFillPath(contextRef);
}
-(void)setDataArray:(NSArray *)dataArray
{
_dataArray = dataArray;
//重新绘制
[self setNeedsDisplay];
}
这里要说明一下,我的数组是百分比数组,由数值转化为百分比的过程我没有在这里处理。
如何使用view:
self.solidCakeView = [[SSSolidCakeView alloc]init]; self.solidCakeView.dataArray = _dataArray; self.solidCakeView.colorArray = _colorArray; self.solidCakeView.nameArray = _nameArray; self.solidCakeView.cakeCenter = CGPointMake(200, 200); self.solidCakeView.cakeRadius = 100; self.solidCakeView.cakeHeight = 30; self.solidCakeView.xScale = 1; self.solidCakeView.yScale = 0.8; self.solidCakeView.backgroundColor = [UIColor whiteColor]; self.solidCakeView.frame = CGRectMake(0, 0, PhoneScreen_WIDTH-100, PhoneScreen_HEIGHT-20); [self.view addSubview:self.solidCakeView];
3D饼图如何绘制及使用已经用代码介绍完了,相信看到这大家应该也能实现3D饼图了。
本文参考了:http://blog.csdn.net/donny_zhang/article/details/9145379 感谢博主!
总结
以上就是这篇文章的全部内容了,希望本文的内容对各位iOS开发者们能有一定的帮助,如果有疑问大家可以留言交流。
# ios
# 绘制饼图
# 绘制饼状图
# 饼状图
# demo
# iOS 生成图片验证码绘制实例代码
# iOS使用Charts框架绘制饼状图
# iOS使用Charts框架绘制折线图
# IOS绘制虚线的方法总结
# iOS App开发中用CGContextRef绘制基本图形的基本示例
# IOS绘制动画颜色渐变折线条
# IOS 绘制三角形的实例详解
# 都要
# 画出
# 基础上
# 不是很
# 上一
# 画了
# 画上
# 图上
# 是在
# 在这里
# 是因为
# 好了
# 一句
# 还不
# 也能
# 就在这
# 会在
# 有一定
# 一遍
# 就没
相关文章:
如何基于云服务器快速搭建网站及云盘系统?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
攀枝花网站建设,攀枝花营业执照网上怎么年审?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
c# 服务器GC和工作站GC的区别和设置
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
如何用西部建站助手快速创建专业网站?
音响网站制作视频教程,隆霸音响官方网站?
如何快速搭建虚拟主机网站?新手必看指南
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
如何快速搭建FTP站点实现文件共享?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
如何在局域网内绑定自建网站域名?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
如何高效配置IIS服务器搭建网站?
,网页ppt怎么弄成自己的ppt?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
潮流网站制作头像软件下载,适合母子的网名有哪些?
平台云上自助建站如何快速打造专业网站?
如何通过老薛主机一键快速建站?
如何快速辨别茅台真假?关键步骤解析
如何通过VPS建站无需域名直接访问?
如何快速生成专业多端适配建站电话?
如何在万网自助建站中设置域名及备案?
如何快速搭建高效可靠的建站解决方案?
,在苏州找工作,上哪个网站比较好?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
建站VPS推荐:2025年高性能服务器配置指南
建站主机选虚拟主机还是云服务器更好?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
如何在IIS管理器中快速创建并配置网站?
如何实现建站之星域名转发设置?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
小程序网站制作需要准备什么资料,如何制作小程序?
制作网页的网站有哪些,电脑上怎么做网页?
如何安全更换建站之星模板并保留数据?
网站制作需要会哪些技术,建立一个网站要花费多少?
高端云建站费用究竟需要多少预算?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
C#如何序列化对象为XML XmlSerializer用法
如何在万网自助建站平台快速创建网站?
如何配置WinSCP新建站点的密钥验证步骤?
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
如何选择高效稳定的ISP建站解决方案?
建站之星伪静态规则如何正确配置?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
如何快速启动建站代理加盟业务?
*请认真填写需求信息,我们会在24小时内与您取得联系。