1)什么是 Graphics(核心绘图)
- Core Graphics 是核心绘图框架,其中的 Quartz 2D API 专门提供图形绘制工作
- 所有 UIKit 的底层渲染工作都是由 Core Graphics 完成的
由于与 UIKit 绑定的非常紧密,因此开发时,引入 UIKit 框架的同时会自动引入 Core Graphics框架
2)什么是 Quartz 2D?
是一个二维绘图引擎
- 同时支持iOS和Mac系统,是跨平台的 是纯c语言
- 数据类型和函数都是CG作为前缀,例如:
CGContextRef
CGPathRef
CGContextStrokePath
- 数据类型不需要使用 “*”
- 需要注意内存管理
3)图形与图像:
图形: 以几何模型来描述画面
图像: 以点和颜色方式来描述画面
4)渲染:
以在屏幕上显示为例,所谓渲染就是在显示之前,按照几何模型的定义转换成对应图像的过程
5) Quartz 2D 能完成的工作
- 绘制图形:线条\三角形\矩形\圆\弧形
- 绘制文字
- 绘制\生成图片(图像)
- 读取\生成PDF
- 截图\裁剪图片
- 自定义 UI 控件
6)使用 Quartz2D 绘图的基本步骤
- 自定义 view
- 重写 drawRect 方法
- 代码顺序
- 获取图形上下文
- 创建路径对象(添加路径)
- 设置路径属性
- 渲染
7)图形上下文 (UIGraphicsGetCurrentContext)
- 图形上下文(Graphics Context):是一个 CGContextRef 类型的数据
- 相同的一套绘图序列,指定不同的 Graphics Context,就可将相同 的图像绘制到不同的目标上
- 图形上下文中主要包含如下信息
- 绘图路径(各种各样的图形)
- 绘图状态(颜色、线宽、样式、旋转、缩放、平移、图片裁剪区域等)
- 输出目标(绘制到什么地方去?UIView、图片、pdf、打印机等
绘图步骤示意图
8)路径
表示几何形状的结构体,例如:线条,矩形,圆,弧线等
9)基本图形绘制
1.矩形
- (void)drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext(); //上下文
CGContextAddRect(ctx, CGRectMake(50, 50, 200, 200));
//矩形大小
CGContextStrokePath(ctx);
//渲染
}
效果:
2)画一条直线
- (void)drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext();
//上下文
CGContextMoveToPoint(ctx, 50, 50);
//起始点
CGContextAddLineToPoint(ctx, 200, 200);
//目标点
CGContextStrokePath(ctx);
//渲染
}
效果:
3)三角形
- (void)drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext(); //上下文
CGContextMoveToPoint(ctx, 50, 50);
//添加一个点
CGContextAddLineToPoint(ctx, 50, 200) ;
//添加一条线
CGContextAddLineToPoint(ctx, 200, 200);
//添加一条线
CGContextClosePath(ctx);
//关闭路径:从最后一条线的终点与起始点连线,建立一个封闭的路径
CGContextStrokePath(ctx);
}
效果:
4) 内切圆形
- (void)drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext(); //上下文
CGContextAddEllipseInRect(ctx, CGRectMake(50, 50, 200, 100));
//50,50为中心点, 200为水平直径,100为垂直直径,当水平和垂直直径相同的时候是一个园
CGContextStrokePath(ctx);
}
效果:
5)
- (void)drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext(); // 上下文
// 绘制圆弧
// /**
// 参数
// 1. 上下文
// 2. 起始点x
// 3. 起始点y
// 4. 半径
// 5. 起始弧度
// 6. 结束弧度
// 7. 是否顺时针,0: 顺时针,1:逆时针
// */
CGContextAddArc(ctx, 200, 200, 100, 0, M_PI, 0);
CGContextStrokePath(ctx);
}
效果: