UIGraphics 绘制饼图

相关设置没有写成宏定义,需要到里面改。自用版。

//

//  YJPieModel.h

//  绘制饼图

//

//  Created by pilgrim on 15/3/3.

//  Copyright (c) 2015年 pilgrim. All rights reserved.

//

#import <Foundation/Foundation.h>

@interface YJPieModel :
NSObject

//饼图数据

@property (nonatomic,
strong) NSNumber * number;

//饼图颜色

@property (nonatomic,
strong) UIColor * color;

//饼图标注

@property (nonatomic,
copy) NSString * title;

//量词

@property (nonatomic,
copy) NSString * quantifier;

//工厂方法

- (instancetype)initWithNumber:(NSNumber *)number color:(UIColor *)color
title:(NSString *)title quantifier:(NSString *)quantifier;

+ (instancetype)YJPieModelWithNumber:(NSNumber *)number color:(UIColor
*)color title:(NSString *)title quantifier:(NSString *)quantifier;

@end

//

//  YJPieModel.m

//  绘制饼图

//

//  Created by pilgrim on 15/3/3.

//  Copyright (c) 2015年 pilgrim. All rights reserved.

//

#import "YJPieModel.h"

@implementation YJPieModel

- (instancetype)initWithNumber:(NSNumber *)number color:(UIColor *)color
title:(NSString *)title quantifier:(NSString *)quantifier

{

if (self = [super
init]) {

_number = number;

_color = color;

_title = title;

_quantifier = quantifier;

}

return
self;

}

+ (instancetype)YJPieModelWithNumber:(NSNumber *)number color:(UIColor
*)color title:(NSString *)title quantifier:(NSString *)quantifier

{

return [[self
alloc] initWithNumber:number
color:color title:title
quantifier:quantifier];

}

@end

//

//  YJPieView.h

//  绘制饼图

//

//  Created by pilgrim on 14-7-13.

//  Copyright (c) 2014年 pilgrim. All rights reserved.

//

#import <UIKit/UIKit.h>

#import "YJPieModel.h"

@interface YJPieView : UIView

//饼图数据模型数组

@property (nonatomic,
strong) NSArray * arrModel;

@end

//

//  YJPieView.m

//  绘制饼图

//

//  Created by pilgrim on 14-7-13.

//  Copyright (c) 2014年 pilgrim. All rights reserved.

//

#import "YJPieView.h"

#import <math.h>

#import "NSString+YJString.h"

@implementation YJPieView

- (void)drawRect:(CGRect)rect

{

//判断是否有数据,如果没有,不再继续进行

if (self.arrModel.count
== 0)

{

NSLog(@"饼图数据缺失。");

return;

}

//计算数据总量

CGFloat totalNumber =
0.0;

for (YJPieModel * model
in self.arrModel)

{

totalNumber = totalNumber + model.number.integerValue;

}

//开启上下文

CGContextRef ctx =
UIGraphicsGetCurrentContext();

//计算原点,半径,开始角度

CGPoint center =
CGPointMake(rect.size.width /
2, rect.size.height /
2);

CGFloat r =
65;

CGFloat startAngle =
0;

int i =
0;

for (YJPieModel * model
in self.arrModel)

{

if (model.number.integerValue <=
0) {

continue;

}

//计算结束角度

CGFloat endAngle = startAngle + model.number.integerValue / totalNumber
* 2 * M_PI;

//贝塞尔路径画圆弧

UIBezierPath * path = [UIBezierPath
bezierPathWithArcCenter:center
radius:r startAngle:startAngle
endAngle:endAngle
clockwise:YES];

//添加到原点的线

[path addLineToPoint:center];

//封闭路径

[path closePath];

//将路径添加到上下文中

CGContextAddPath(ctx, path.CGPath);

//设置颜色

UIColor * color;

if (model.number.integerValue ==
0)

{

color = [UIColor
clearColor];

}else

{

color = model.color;

}

[color set];

//画图,填充模式

CGContextDrawPath(ctx,
kCGPathFill);

CGContextSetLineWidth(ctx,
1.0);

CGContextSetStrokeColorWithColor(ctx, model.color.CGColor);

CGContextMoveToPoint(ctx, center.x, center.y);

CGFloat x = center.x + (10 + r) *
cos(endAngle - (endAngle - startAngle) /
2);

CGFloat y = center.y + (10 + r) *
sin(endAngle - (endAngle - startAngle) /
2);

CGContextAddLineToPoint(ctx, x, y);

CGFloat landLineX;

if (endAngle - (endAngle - startAngle) /
2 > M_PI_2 && endAngle - (endAngle - startAngle) /
2 < 3 *
M_PI_2) {

landLineX = x - 5;

}else

{

landLineX = x + 5;

}

CGContextAddLineToPoint(ctx, landLineX, y);

CGContextStrokePath(ctx);

NSString * titleStr = [NSString
stringWithFormat:@"%@%@%@", model.title, model.number,
model.quantifier];

if (endAngle - (endAngle - startAngle) /
2 > M_PI_2 && endAngle - (endAngle - startAngle) /
2 < 3 *
M_PI_2) {

CGSize titleStrSize = [NSString
sizeWithText:titleStr
font:[UIFont
systemFontOfSize:12.0]
maxSize:CGSizeMake(MAXFLOAT,
14)];

[titleStr drawAtPoint:CGPointMake(landLineX - titleStrSize.width,
y - 7) withAttributes :
@{NSFontAttributeName: [UIFont
systemFontOfSize:12.0],
NSForegroundColorAttributeName:model.color}];

}else

{

[titleStr drawAtPoint:CGPointMake(landLineX, y -
7) withAttributes :
@{NSFontAttributeName: [UIFont
systemFontOfSize:12.0],
NSForegroundColorAttributeName:model.color}];

}

startAngle = endAngle;

//画文字

//        CGPoint textPoint;

//        if (startAngle < M_PI_2 || startAngle > 3 * M_PI_2) {

//            textPoint = CGPointMake(<#CGFloat x#>, <#CGFloat y#>)

//        }

//        model.number.stringValue drawAtPoint:CGPointMake(<#CGFloat x#>, <#CGFloat y#>) withAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:12.0], NSForegroundColorAttributeName:[UIColor whiteColor]}

i ++;

//        //添加标注

//        UILabel * lblTitle = [[UILabel alloc] initWithFrame:CGRectMake(100, rect.size.width + 30 * i, 100, 30)];

//        lblTitle.textColor = [UIColor blackColor];

//        lblTitle.font = [UIFont systemFontOfSize:15];

//        lblTitle.backgroundColor = [UIColor whiteColor];

//        lblTitle.text = [NSString stringWithFormat:@"%@%@次", model.title, model.number];

//        [self addSubview:lblTitle];

//

//        //添加标注色块

//        UIView * vColor = [[UIView alloc] initWithFrame:CGRectMake(65, rect.size.width + 30 * i + 5, 20, 20)];

//        vColor.backgroundColor = model.color;

//        [self addSubview:vColor];

}

}

#pragma mark - 懒加载

- (void)setArrModel:(NSArray *)arrModel

{

_arrModel = arrModel;

[self
setNeedsDisplay];

}

@end

时间: 2024-11-10 19:27:31

UIGraphics 绘制饼图的相关文章

Qt之自绘制饼图

1.说明 最近在搞绘图方面的工作,说实话C++的第三方绘图库并不算多,总之我了解的有:qtcharts.ChartDirector.qwt.kdchart和QCustomPlot.这几个库各有利弊. qtcharts:qt5.7之后才开源的模块,支持绘制各种图标,并且功能相当丰富,但是可扩展性差,如果自己想高度定制,比较困难,主要是和qt的源码风格有决定性的关系. ChartDirector:开源的第三方绘图库,使用方便,推荐使用 qwt:主要绘制仪表盘类似的东西(这个库可以编译后加入qt帮助文

c# 通过.net自带的chart控件绘制饼图pie chart

c# 通过.net自带的chart控件绘制饼图pie chart 需要实现的目标是: 1.将数据绑定到pie的后台数据中,自动生成饼图. 2.生成的饼图有详细文字的说明. 具体的实现步骤: >>前台界面的设置: 1.设置chart1的属性Legends中默认的Legend1的Enable为false: 2.设置Series的ChartType为Pie 3.设置Series显示的文字内容(此处比较关键) 至此,前台的设置完成. >>下面填写后台代码: List<string&g

QT绘制饼图

QT版本:QT5.6.1 QT绘制饼图,出问题的代码如下 void DrawPieDialog::paintEvent(QPaintEvent *event) { float startAngle=0; float spanAngle=( (qreal) (sell) / (qreal)(sell+last) ) *360; QPoint startPt(30,30); //圆心 QRect rect(startPt.x(), startPt.y(), 200, 200); QPainter p

【带着canvas去流浪】 (3)绘制饼图

目录 一. 任务说明 二. 重点提示 三. 示例代码 四. hover高亮的实现思路 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 华为云社区地址:[你要的前端打怪升级指南] 一. 任务说明 使用原生canvasAPI绘制饼图(南丁格尔玫瑰).(截图以及数据来自于百度Echarts官方示例库[查看示例链接]). 二. 重点提示 南丁格尔玫瑰图的画法有很多种,Echarts中提供的以半径或面积两种不同模

iOS导入CorePlot用于绘制饼图

最近在iOS开发中用到CorePlot,遇到几个问题: 错误: missing required architecture x86_64 in file libCorePlot-CocoaTouch.a 解决方法:其1.5以上版本才支持64位的系统,下载CorePlot 错误: dyld: Library not loaded 解决方法暂时参考 http://blog.sina.com.cn/s/blog_735744180101crct.html ,大意是将出现问题的CorePlot.fram

关情纸尾-----Quartz2D绘制下载进度条,饼图

绘制下载进度条 1.搭建界面. 2.拖动滑竿的时候让他里面的能够跟着我的拖动,数字在改变. 数字改变时有一个注意点, 就是要显示%,它是一个特殊的符号,要用两个%%代表一个% 3.拖动滑竿的时候就是在上面画弧. 从最上面,按顺时针画,所以,它的起始角度是-90度.结束角度也是-90度 也是从起始角度开始画, 起始角度-90度, 看你下载进度是多少 假如说你下载进度是100,就是1 * 360度 也就是说这个进度占你360度多少分之一 CGContextRef ctx = UIGraphicsGe

关情纸尾-----Quartz2D绘制圆形下载进度条,饼图

绘制下载进度条 1.搭建界面. 2.拖动滑竿的时候让他里面的能够跟着我的拖动,数字在改变. 数字改变时有一个注意点, 就是要显示%,它是一个特殊的符号,要用两个%%代表一个% 3.拖动滑竿的时候就是在上面画弧. 从最上面,按顺时针画,所以,它的起始角度是-90度.结束角度也是-90度 也是从起始角度开始画, 起始角度-90度, 看你下载进度是多少 假如说你下载进度是100,就是1 * 360度 也就是说这个进度占你360度多少分之一 CGContextRef ctx = UIGraphicsGe

[转]用Matplotlib绘制 折线图 散点图 柱状图 圆饼图

Matplotlib是一个Python工具箱,用于科学计算的数据可视化.借助它,Python可以绘制如Matlab和Octave多种多样的数据图形. 安装 Matplotlib并不是Python的默认组件,需要额外安装. 官方下载地址 http://matplotlib.org/downloads.html 必须下载与自己的Python版本,操作系统类型对应的安装包.如Windows 64位+Python3.3,应该下载matplotlib-1.3.1.win-amd64-py3.3.exe 第

【实验】pyecharts 1.5.0 饼图的绘制

<Python3 爬虫.数据清洗与可视化实战>第十一章介绍pyecharts,是基于 0.2.3版本的. pyecharts已经更新到1.5.0版本,调用饼图所需要的参数已经不同. 安装旧版本pyecharts太费劲,所以选择使用最新版本(2019.09)的pyecharts 1.5.0, 相应地,书中绘制饼图的代码需要修改一下. 修改如下: 1 from pyecharts.charts import Pie ## 注意,Pie被放进了charts 2 import json 3 f = o