CoreGraphics中最关键的部分是一个名为Quartz 2D的API集合,它包含了各种函数、数据类型以及对象,能够让大家在内存中直接绘制视图和图像。
CoreGraphics框架几个重要概念:
画布(page):Quartz 2D将正在进行绘制的视图视作一个虚拟的画布,在画布上用画笔画画,就必须遵循一定的规则,例如,绘制的内容是有先后顺序的。
路径(Path):当你拿到一支画笔时,就能够随心所欲地在画纸上绘画,画笔移动的轨迹就是路径。
绘图上下文(Graphics Context):绘图上下文有时也称为绘图环境。绘图上下文中会保存绘图的信息和状态,并负责将图形绘制在视图上,即绘图的输出终端(Drawing Destination)。
在使用CoreGraphics框架对视图进行绘图操作时,UIView中如下的几个方法需要程序员重点关注,这涉及绘图的时机。
drawRect方法:当视图每次需要进行自身重新绘制时都会调用该方法,所以如果在drawRect:
方法中插入视图绘制的代码,那么这段绘图代码就会起效,从而对视图进行重绘。该方法会被系统自动调用。
-(void)drawRect:(CGRect)rect;
setNeedDisplay方法:当手工调用这个方法时,会调用drawRect:方法进行绘图,但该方法是异步执行的,
即不是立即调用drawRect:方法进行绘图,而是在屏幕每次刷新后才会调用。
-(void)setNeedsDisplay;
UIBezierPath类属于UIKit框架,主要用于绘图中设置绘图的路径。在CoreGraphics中,也提供了CGPath类以及CGContext类可以用于绘图。
UIBezierPath类主要用于创建一个路径对象,因此在UIBezierPath类中提供了创建各种类型路径的方法,例如直线路径、曲线路径等。
// 实例化一个贝塞尔路径对象。
+(UIBezierPath *)bezierPath;
// 初始化矩形路径。
+(UIBezierPath *)bezierPathWithRect:(CGRect)rect;
// 初始化一个圆角的矩形路径。
+(instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius;
// 初始化椭圆形路径。
+(UIBezierPath *)bezierPathWithOvalInRect:(CGRect)rect;
// 初始化弧形路径。需要设置四个参数,包括弧形的圆心点、弧度以及起始、终止角度。
+(UIBezierPath *)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;
// 设置当前绘图所在的点位,即设置画笔当前的位置。
-(void)moveToPoint:(CPoint)point;
// 从绘图当前点位绘制一条直线到目标点位。
-(void)addLineToPoint:(CGPoint)point;
// 从绘图当前点位绘制一条圆弧到目标点位,弧度需要由控制点controlPoint决定。
-(void)addQuadCurveToPoint:(CGPoint) endPoint controlPoint:(CGPoint)controlPoint;
// 封闭当前的路径
-(void)closePath;
// 填充路径所封闭的区域。
-(void)fill
// 画线
-(void)stroke;
绘图方法和步骤
1.drawRect:方法的调用时机
drawRect:方法是UIView类定义中的方法,视图每次需要进行自身重新绘制时都会调用该方法,所以如果在drawRect:方法中插入绘图代码,那么这段绘图代码就会起效,从而对视图进行重绘
drawRect:方法主要在如下几个情形下会被调用。
当视图第一次显示到屏幕之前。
当调用视图的setNeedDisplay或者setNeedDisplayInRect:方法,通知重新绘图时。
调用sizeToFit方法后,会调用drawRect:方法。
2.常见的绘图步骤:当在drawRect:方法中进行绘图时,一般会遵循如下的步骤进行:
获得图形上下文(取得画布),需要调用UIGraphicsGetCurrentContext()函数。
设置路径(绘图),通常使用贝塞尔路径。
设置绘图上下文的属性与状态,如是否填充,填充颜色等。
添加路径到上下文,调用CGContextAddPath()函数。
渲染上下文,调用CGContextStrokePath()函数,输出绘图图像到屏幕。
示例
-(void)drawRect:(CGRect)rect {
// 获取绘图上下文
CGContextRef contect = UIGraphicsGetCurrentContext();
// 设置绘图路径
// 创建路径
UIBezierPath *path = [UIBezierPath bezierPath];
// 创建起始点
CGPoint startPoint = CGPointMake(5, 5);
CGPoint secondPoint = CGPointMake(50, 95);
CGPoint thirdPoint = CGPointMake(95, 5);
// 画线
[path moveToPoint:startPoint];
[path addLineToPoint:secondPoint];
[path addLineToPoint:thirdPoint];
[path closePath];
// 设置线的属性
[[UIColor redColor] setStroke];
// 设置填充颜色
[[UIColor yellowColor] setFill];
[path fill];
// 设置线边的宽度
CGContextSetLineWidth(context, 3.0);
// 添加路径到上下文
CGContextAddPath(context, path.CGPath);
// 渲染上下文
CGContextStrokePath(context);
}
常用绘制方法
绘制直线
-(void)drawRect:(CGRect)rect {
}