天天看点

拥抱Core Graphics吧!

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指定线条的终点,并在这两点之间画线。其他,还可以指定线条的颜色等。下面用具体的代码

来说明。代码:

拥抱Core Graphics吧!

 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);

拥抱Core Graphics吧!

18 } 

最后结果,如图: 

拥抱Core Graphics吧!

 绘制长方形

 绘制是用cgrect变量指定位置和长,宽值。然后把该变量作为参数传给函数cgcontextaddrect

拥抱Core Graphics吧!

 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);

拥抱Core Graphics吧!

14 } 

效果如下: 

拥抱Core Graphics吧!

绘制上下文状态保存 

从上面绘制的例子中可以看出。即使只是简单的画一条线也需要调好几个函数来设置这条线的

颜色、宽度,沿着哪条路径绘制等属性。 core graphics会保存这些属性在其内部的栈中。这个绘制状态就好比是一直笔,

你可以换笔头,颜色来画出不同的效果。但是如果你忘记把所有的东西换回去,那么下次再画出来的效果难保不会出乎意料。

函数cgcontextsavegstate和函数cgcontextrestoregstate专门用来处理绘制状态。cgcontextsavegstate函数

就相当于给你当前的绘制状态打了个书签,之后你可以任意修改你想要修改的属性。然后可以用函数cgcontextrestoregstate来重置绘制状态,

回到打了书签的地方。这两个函数必须要配对使用! 否则的话,绘制状态就全部乱了,要不绘出来的不是你想要,要不绘制都无法继续。

拥抱Core Graphics吧!

 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);

拥抱Core Graphics吧!

21 }

view的重绘

苹果文档的一段话说的非常清楚: 

对遮挡您的视图的其它视图进行移动或删除操作。

将视图滚出屏幕,然后再重新回到屏幕上。

最后,暂时先总结这么多,后面会陆续深入讲解这部分内容。只要参考着苹果的官方文档多练。在实际开发中多用。你自然会对core graphics驾轻就熟。

希望此文对你有所帮助。谢谢! 

欢迎加群互相学习,共同进步。qq群:ios: 58099570 | android: 330987132 | go:217696290 | python:336880185 | 做人要厚道,转载请注明出处!

继续阅读