标签:
在最近的需求中需要用折线图,柱形图,饼状图来显示一些数据,于是去网上找了一些资料,了解了绘图
绘图,就像我们画画一样,直线,曲线,形状等等,使用quart2d的思路也是一样的,首先去获得视图上下文,换而言之就是去获得你的画板,
CGContextRef context = UIGraphicsGetCurrentContext(); // 该方法能获得当前视图上下文,也就是我们等下需要操作的画板
画板有了,那我们就从最初始的直线画起吧,画直线,你需要一个起点,一个终点,连接起来,直线不久出来了么,
CGContextMoveToPoint(context, 30, 30);// 起点
CGContextAddLineToPoint(context, 30, 90);// 终点
CGContextStrokePath(context);// 连接两个点形成直线 渲染方式
这样我们就画出了一条直线,直线的顶端形状,颜色,大小粗细可以自己去查找响应的方法,需要注意的是如果你需要画多条直线,你就需要多次指定起点终点,如果没有再次说明起点的话,你接下来话的起点会以前一条直线的终点作为起点,当然后面会说如果多次绘图采用更好的方法。
如果你需要绘制图形的话思路也是一样的,画点,然后将点连起来,需要说明的是比如三角形,你需要说明3个点,然后只需要将渲染方式改为CGContextStrokePath(ctx);// 形成闭合区间
即可,他会形成一个闭合空间,关于渲染方式还有很多,比如填充之类的,可以去看看官方文档。
那么最基本的图形就可以绘制了,可是曲线,椭圆,圆形呢?其实思路还是一样的,ios给我们封装好了这些方法,如果你需要自己绘制自定义图形那就需要你自己去写函数了。常见图形如下:
圆形:CGContextAddArc(ctx, 100, 100, 50, 0, 2 * M_PI, 0);
椭圆:CGContextAddEllipseInRect(ctx, CGRectMake(50, 100, 100, 230));
圆弧:CGContextAddArc(ctx, 100, 100, 50, M_PI_2, M_PI, 0);
ok,那我们对基本的绘图有了一定的了解,哪他到底是怎么工作的呢,视图在被创建加载时会加载drawRect:方法,在这个方法里面他会获得这个视图的信息,并复制保存在一块画板上(暂且你可以这么认为),而我们操作的是这个画板而不是原生的视图,我们在这个画板上涂鸦,画完之后(方法结束)他会将这个画板显示在视图上,可以这么理解,我们先对视图表面上的东西做了一个复制,然后我们在这个复制品上进行绘图,完之后将这个复制品显示在视图上,但是对于原物我们并没有改变什么,。这是我的理解。
如果对于这个的理解不够的话,我们可以做下试验,在drawRect:方法开始的时候,我们用CGContextSaveGState(ctx);方法来获得保存最原始的画板,也就是我所说的原物。然后我们去进行绘图,之后我们获取最原生被我们所保存的那份视图CGContextRestoreGState(ctx);,接着再去绘图,唔,好像并不能证明他的工作机制,好吧,这个暂且放下,只要记住他的工作原理确实是这样。需要说明的是,我们保存了几份原生画板,那就只能用几次,一次性用品,如果你需要多次使用那你只能多次声明,不然崩了别怪我。
暂且我们画出了中规中矩的图形,如果你需要做形变,那也很简单,
旋转:CGContextRotateCTM(ctx, M_PI_4);
缩放:CGContextScaleCTM(ctx, 0.5, 1.5);
平移:CGContextTranslateCTM(ctx, 50, 100);
需要说明的是,画图和我们想的是不一样的,我们想的是先画然后在形变,可是你画画你能做到画完再去放大缩小?不能吧,我们只能先就说好了我们这个要旋转,这个要放大,然后再来画图,绘图也一样,先声明,然后绘图。
画图,就是去绘制路径,一条直线就是一条路径,所以如果我们需要在一个视图上绘制多个图形,那使用上下文设置起点终点就不太好管理了,这个时候我们就需要采用路径来管理,一条路径就是一次绘图。
CGMutablePathRef path=CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 20, 20);
CGPathAddLineToPoint(path, NULL, 200, 300);
CGContextAddPath(ctx, path);
CGContextStrokePath(ctx);
这样我们就创建了一条路径,如果我们要对这条路径操作,就只需要操作path了。这样明显的更加方便管理,当然,我个人觉得如果你需要管理特别多的路径,那绘图肯定不是解决你问题的首选方法。
ok,对于这些基本操作我们有了了解,那我们就开始绘制折线图吧,首先你需要说明x,y轴以及他们的刻度,这很简单,两条直线,然后依据你的刻度数量去平分直线的长度,这样就能很简单的画出坐标轴,然后就是数据折线了,这个也很简单,依据你具体数据,去计算在x轴的位置,y轴的位置,然后将一个个点串起来,就形成了折线,思路就这么简单,柱形也是一样的,问题解决。
标签:
原文地址:http://www.cnblogs.com/xiaojywuxy/p/4383454.html