Core Graphics是基于C的API,可以用于一切绘图。Quartz 2D是Core Graphics框架的一部分,是一个强大的二维图像绘制引擎。Quartz 2D在UIKit中也有很好的封装和集成,我们日常开发时所用到的UIKit中的组件都是由Core Graphics进行绘制的。不仅如此,当我们引入UIKit框架时系统会自动引入Core Graphics框架,并且为了方便开发者使用在UIKit内部还对一些常用的绘图API进行了封装。 不废话,直接来看利用Core Graphics怎么绘图。
一般步骤
1、获取绘图上下文
2、创建并设置路径
3、将路径添加到上下文
4、设置上下文状态
5、绘制路径
图形上下文CGContextRef代表图形输出设备(也就是绘制的位置),包含了绘制图形的一些设备信息。Quartz 2D中所有对象都必须绘制在图形上下文.
获取上下文有两种方式:
- 在
drawRect
中可以直接获取; - 在
UIGraphicsBeginImageContext()
等手动开启上下文之后也能获取
线条
下面绘制的时一条实心红色实线
1 |
|
下面时绘制一条带阴影的点划线
1 |
|
UIKit已经为我们准备好了一个上下文,在drawRect:方法(这个方法在loadView、viewDidLoad方法后执行)中我们可以通过UIKit封装函数UIGraphicsGetCurrentContext()方法获得这个图形上下文 然后我们按照上面说的步骤一步一步的执行下来得到结果:
得到结果如图:
图形绘制
矩形, 其他比如椭圆, 圆形, 扇形等方法类似
1 |
|
运行结果:
绘制贝塞尔曲线
在Quartz 2D中曲线绘制分为两种:二次贝塞尔曲线和三次贝塞尔曲线。二次曲线只有一个控制点,而三次曲线有两个控制点,如下图所示:
二次贝塞尔
1 |
|
三次贝塞尔
1 |
|
结果:
文字绘制
Core Graphics不仅可以画图还能绘制文字, 能设置了绘制区间、字体颜色段落属性等 当然还可以设置更多其他属性,主要方法如下:
//如下方法还有很多变种, 使用方法类似 [str drawAtPoint:CGPointMake(10, 100) withAttributes:nil];图像绘制
当然Core Graphics也能绘制图像,很简单
1 |
|
绘制渐变
Quartz 2D的渐变方式分为两种:
线性渐变线:渐变色以直线方式从开始位置逐渐向结束位置渐变
径向渐变:以中心点为圆心从起始渐变色向四周辐射,直到终止渐变色
在iOS中绘制渐变还需要注意一点就是指定颜色空间,所谓颜色空间就是不同颜色在不同的维度上取值最终组成一种颜色的过程。就拿RGB来说,如果将红色、绿色、蓝色看成是x、y、z轴坐标系,那么在三个坐标上分别取0~255范围内的不同值则可以组成各类颜色。当然,不同颜色空间的“坐标系”也是不同的(也就是说颜色表示的方式是不同的),常用的颜色空间除了RGB还有CMYK(印刷业常用这种颜色模式)、Gray
下面的代码分别演示了两种渐变方式,具体渐变绘制函数参数代码中已经注释的很清楚了:
线性渐变
1 |
|
径向渐变
1 |
|
运行效果
叠加模式
使用Quartz 2D绘图时后面绘制的图像会覆盖前面的,默认情况下如果前面的被覆盖后将看不到后面的内容,但是有时候这个结果并不是我们想要的,因此在Quartz 2D中提供了填充模式供开发者配置调整。由于填充模式类别特别多。 因此下面以一个例子来说明:
1 |
|
NSMutableArray *arr0 = [NSMutableArray array];
for (int i = 0; i<28; i++) {
CGRect rect = CGRectMake(190, self.safeAreaInsets.top + i * 25, 10, 250);
[arr0 addObject:@(rect)];
}
1 |
|
对比代码和显示效果查看每种叠加效果
上下文变换
在view中可以利用transform对试图进行平移旋转缩放,绘图中我们也经常用到图形形变,在CoreText中绘制文字的时候因为Core Graphics坐标原点在左下角、UIKit在右上角 。所有要通过变换转过来,下面通过一个图片的变换演示一下图形上下文的形变
1 |
|
绘制图像
在drawRect中绘制:
1 |
|
直接开启图片上下文绘制
利用位图图形上下文给一个图片添加水印,在下面的程序中我们首先创建上下文,然后在上下文中绘制图片、直线和文本,最后从当前位图上下文中取得最终形成的新图片显示到界面
1 |
|
// 注意:上面这种方式绘制的图像除了可以显示在界面上还可以调用对应方法进行保存(代码注释中已经包含保存方法);除此之外这种方法相比在drawRect:方法中绘制图形效率更高,它不用每次展示时都调用所有图形绘制方法。
绘制pdf
绘制到PDF则要启用pdf图形上下文,PDF图形上下文的创建使用方式跟位图图形上下文是类似的,需要注意的一点就是绘制内容到PDF时需要创建分页,每页内容的开始都要调用一次UIGraphicsBeginPDFPage();方法。下面的示例演示了文本绘制和图片绘制(其他图形绘制也是类似的):
1 |
|
drawRect的刷新直接调用setNeedsDisplay相信大家都知道在适当的时候调用即可。