嘿!我又回来了。
在前面我介绍了iOS的视图机制,我也提到了iOS的视图框框可以通过drawRect自己绘图,我也说过每个view的layer(CALayer)就像一个视图的投影,其实我们也可以来操作它定制一个视图,例如半透明圆角背景的视图。
要完成自己在视图上绘图,大家一定要了解一下iOS的绘图机制了。今天我试图也通俗地说一下iOS的绘图。
在iOS中绘图可以有两种方式:
1,采用iOS的核心图形库。
2,采用OpenGL ES。
这两个库的不同我简单介绍一下:
前者主要是通过核心图形库和UIKit进行封装,其更加贴近我们经常操作的视图(UIView)或者窗体(UIWindow)。例如我们前面提到的drawRect,我们只负责在drawRect里进行绘图即可,我们没有必要去关注界面的刷新频率,至于什么时候调drawRect都有iOS的视图绘制来管理。
那么OpenGL ES经常用在游戏等需要对界面进行高频刷新和自由控制。通俗理解一下就是其更加切近直接对屏幕的操控。在很多游戏编程中可能我们不需要一层一层的框框,直接在界面上绘制,并且通过多个的内存缓存绘制来让画面更加流畅。
那换句话来说,OpenGL ES完全可以作为视图机制的底层图形引擎。他们就这个关系了。
大概了解这个就行了。OpenGL和Direct X 等我们到处能看到的。我们不再累赘了,今天我们的主题主要侧重前者,并且侧重如何通过绘图机制来定制我们的视图。先来看看我们最熟悉的Windows自带画图器(我觉得它就是对原始画图工具的最直接体现):
如果你会用绘图器绘制线条,形状,文字,选择颜色,并且和可以填充,那么iOS中的绘图机制也可以做得到,只是你用程序绘制的时候,整个画图板你要装载脑子里。
那我们开始:
如果你要绘图,你最起码得有个面板吧?无论它是墙,纸还是内存,都是这样了。那在iOS绘图中是个什么呢?就是个画图板(Graphics Contexts)。所有画图板首先要规定一下了,否则,计算机的画图都是需要我们用数字告诉人家的,那坐标体系就先要明确一下了。
在iOS的2D绘图中采用的就是我们熟知的直角坐标系,即原点在左下方,右上为正轴,这里要注意的是和我们在视图(UIView)中布局的坐标系是不一样的,他的圆点在左上,右下为正轴。当我们在视图的drawRect中工作的时候拿到的画板已经是左上坐标的了,那这时候你要去把一个有自己坐标体系的内容直接绘制,就会出现坐标不一致问题,例如直接绘制图片就会倒立。(后面我们会说坐标变换的一些内容,这里不要急)。
前面我们也说了Windows画图板里面我们至少还看到个画图板,那在iOS绘图中其实我们也有个"虚拟"的画图板(Graphics Contexts),所有的绘图操作都在这个画图板里面操作。
在视图(UIView)的drawRect中操作时,其实视图引擎已经帮我们准备好了画板(记着windows画图板啊,这样我说什么你就明白了),甚至连当前线条的粗细,当前绘制的颜色等都给你传递过来了。你只需要“接”到这个画板,然后拿起各种绘图工具绘就可以了。
光说不练不行啊,我给个简单例子说明一下绘图过程:
-(void)drawRect:(CGRect)rect{
CGContextRef ref=UIGraphicsGetCurrentContext();//拿到当前被准备好的画板。在这个画板上画就是在当前视图上画
CGContextBeginPath(ref);//这里提到一个很重要的概念叫路径(path),其实就是告诉画板环境,我们要开始画了,你记下。
CGContextMoveToPoint(ref, 0, 0);//画线需要我解释吗?不用了吧?就是两点确定一条直线了。
CGContextAddLineToPoint(ref, 300,300);
CGFloat redColor[4]={1.0,0,0,1.0};
CGContextSetStrokeColor(ref, redColor);//设置了一下当前那个画笔的颜色。画笔啊!你记着我前面说的windows画图板吗?
CGContextStrokePath(ref);//告诉画板,对我移动的路径用画笔画一下。
}
无论你画圈圈,还是画什么都少不了如下几步:
1,拿到当前面板
2,开始画声明
3,画
4,提交画
这篇文章被我罗索的太长,我再增加一篇吧。累死我了。请看 iOS的绘图机制二。
原文链接: http://blog.csdn.net/love_hot_girl/article/details/6962396