core graphics用于处理本地2d向量渲染和图片渲染。其中满是名称相近,让人郁闷的c接口。
对于在ios上编程有一段时间的人来说有别的方法也会尽量避免使用这些c函数。
毕竟直接用xcode已有控件的话,只要拖一拖,然后少许的代码就可以做出某些效果,何必
自找苦吃?!但是core graphics有一个很大的优点:快! ps,我不是说要重复找轮子。
绘制在drawrect:方法中进行
当一个view需要绘制的时候,drawrect:方法会被调用。在这个方法中core graphics就会发挥作用,
你指定的区域会被重新绘制。但是你没法直接绘制uiview,而是继承uiview并自己实现drawrect:这个方法来进行绘制。
找到绘制的上下文
在绘制先需要保证绘制所在的上下文是在当前的view中。当前上下文使用uigraphicsgetcurrentcontext获得。
对于当前上下文,可以理解为core graphics对于当前所操作view的绘制操作一个指针,跟踪了全部的绘制操作。在c库中很多。
相当于面向对象编程语言中一个类的self指针。示例:
1 - (void)drawrect:(cgrect)rect {
2 cgcontextref ctx = uigraphicsgetcurrentcontext();
3 // 绘制操作
4 }
在之后的代码里就可以用ctx来表示当前上下文。
绘制
绘制uiimage可以非常的简单,如:
3 uiimage *img = [uiimage imagenamed:@"myimage.png"];
4 [img drawinrect:rect];
5 }
画线
用core graphics画线和平时用笔画线的逻辑是一样的。先找到起始点,放下画笔,然后给画笔一系列的指令告诉它之后
往哪里画。每往下画一段都以上一段的终点为起点。用函数cgcontextmovetopoint把画笔移动到起始点。然后用函数
cgcontextaddlinetopoint指定线条的终点,并在这两点之间画线。其他,还可以指定线条的颜色等。下面用具体的代码
来说明。代码:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
1 - (void)drawrect:(cgrect)rect
2 {
3 // 获取当前绘图上下文
4 cgcontextref con = uigraphicsgetcurrentcontext();
5
6 // 绘制箭杆部分
7 cgcontextmovetopoint(con, 100, 100);
8 cgcontextaddlinetopoint(con, 100, 25);
9 cgcontextsetlinewidth(con, 20);
10 cgcontextstrokepath(con);
11
12 // 绘制箭头部分
13 cgcontextsetfillcolorwithcolor(con, [[uicolor redcolor] cgcolor]);
14 cgcontextmovetopoint(con, 80, 25);
15 cgcontextaddlinetopoint(con, 100, 0);
16 cgcontextaddlinetopoint(con, 120, 25);
17 cgcontextfillpath(con);
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
18 }
最后结果,如图:
绘制长方形
绘制是用cgrect变量指定位置和长,宽值。然后把该变量作为参数传给函数cgcontextaddrect
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
1 - (void)drawrect:(cgrect)rect {
2
3 cgcontextref context = uigraphicsgetcurrentcontext();
4
5 cgcontextsetlinewidth(context, 2.0);
6
7 cgcontextsetstrokecolorwithcolor(context, [uicolor bluecolor].cgcolor);
8
9 cgrect rectangle = cgrectmake(60,170,200,80);
10
11 cgcontextaddrect(context, rectangle);
12
13 cgcontextstrokepath(context);
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
14 }
效果如下:
绘制上下文状态保存
从上面绘制的例子中可以看出。即使只是简单的画一条线也需要调好几个函数来设置这条线的
颜色、宽度,沿着哪条路径绘制等属性。 core graphics会保存这些属性在其内部的栈中。这个绘制状态就好比是一直笔,
你可以换笔头,颜色来画出不同的效果。但是如果你忘记把所有的东西换回去,那么下次再画出来的效果难保不会出乎意料。
函数cgcontextsavegstate和函数cgcontextrestoregstate专门用来处理绘制状态。cgcontextsavegstate函数
就相当于给你当前的绘制状态打了个书签,之后你可以任意修改你想要修改的属性。然后可以用函数cgcontextrestoregstate来重置绘制状态,
回到打了书签的地方。这两个函数必须要配对使用! 否则的话,绘制状态就全部乱了,要不绘出来的不是你想要,要不绘制都无法继续。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
3 cgcontextref ctx = uigraphicsgetcurrentcontext();
4
5 // 设置属性
6 cgcolorref whitecolor = [uicolor whitecolor].cgcolor;
7 cgcolorref lightcolor = _lightcolor.cgcolor;
8 cgcolorref darkcolor = _darkcolor.cgcolor;
9 cgcolorref shadowcolor = [uicolor colorwithred:.2f green:.2f blue:.2f alpha:.5f].cgcolor;
10
11 cgcontextsetfillcolorwithcolor(ctx, whitecolor);
12 cgcontextfillrect(ctx, _paperrect);
13
14 // 保存绘制属性
15 cgcontextsavegstate(ctx);
16
17 // 绘制。。。
18
19 // 还原绘制属性
20 cgcontextrestoregstate(ctx);
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
21 }
view的重绘
苹果文档的一段话说的非常清楚:
对遮挡您的视图的其它视图进行移动或删除操作。
将视图滚出屏幕,然后再重新回到屏幕上。
最后,暂时先总结这么多,后面会陆续深入讲解这部分内容。只要参考着苹果的官方文档多练。在实际开发中多用。你自然会对core graphics驾轻就熟。
希望此文对你有所帮助。谢谢!
欢迎加群互相学习,共同进步。qq群:ios: 58099570 | android: 330987132 | go:217696290 | python:336880185 | 做人要厚道,转载请注明出处!