iOS开发之Quartz2D的介绍与使用详解

2020-01-18 22:02:02王冬梅


CGContextRef ctx = UIGraphicsGetCurrentContext();

(b)绘制相应的图形内容

例如:画1/4圆(扇形)


CGContextMoveToPoint(ctx, 100, 100);
 
CGContextAddLineToPoint(ctx, 100, 150);
 
CGContextAddArc(ctx, 100, 100, 50, -M_PI_2, M_PI, 1);
 
CGContextClosePath(ctx);
 
 
[[UIColor redColor] set];

(3)利用图形上下文将绘制的所有内容渲染显示到view上面


CGContextFillPath(ctx);

注:


//M_PI的含义:π
//M_PI * 2的含义:2π
 
//M_PI_2的含义:π/2
//M_PI / 2的含义:π/2
 
// 画的图形路径
//bezierPathWithArcCenter:弧所在的圆心
//radius:圆的半径
//startAngle:开始角度,圆的最右侧为0度
//endAngle:截至角度,向下为正,向上为负.
//clockwise:时针的方向,yes:顺时针 no:逆时针
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:self.center radius:radius startAngle:startA endAngle:endA clockwise:NO];

完整代码:


//
// MyView.m
// Quartz2DTest
//
// Created by 李峰峰 on 2017/2/6.
// Copyright © 2017年 李峰峰. All rights reserved.
//
 
#import "MyView.h"
 
@implementation MyView
 
- (instancetype)initWithFrame:(CGRect)frame
{
 self = [super initWithFrame:frame];
 if (self) {
 self.backgroundColor = [UIColor whiteColor];//设置背景为白色,为了便于观察绘制后的效果
 }
 return self;
}
 
 
- (void)drawRect:(CGRect)rect {
 
 CGContextRef ctx = UIGraphicsGetCurrentContext();
 
 CGContextMoveToPoint(ctx, 100, 100);
 CGContextAddLineToPoint(ctx, 100, 150);
 CGContextAddArc(ctx, 100, 100, 50, -M_PI_2, M_PI, 1);
 CGContextClosePath(ctx);
 
 [[UIColor redColor] set];
 
 CGContextFillPath(ctx);
 
}
 
@end

运行效果:

ios,quartz2d,详解,quartz2d教程

2、核心方法drawRect:

为什么要实现drawRect:方法才能绘图到view上?

因为在drawRect:方法中才能取得跟view相关联的图形上下文

drawRect:方法在什么时候被调用?

当view第一次显示到屏幕上时(被加到UIWindow上显示出来)

调用view的setNeedsDisplay或者setNeedsDisplayInRect:时.

注意4点:

    手动调用drawRect:方法,不会自动创建跟View相关联的上下文。应该调用setNeedsDisplay方法,系统底层会自动调用drawRect,告诉系统重新绘制View.这样,系统底层会自动创建跟View相关联的上下文 setNeedsDisplay底层会调用drawRect,并不是立马调用的.只是设了一个调用的标志.调用时刻是等下一次屏幕刷新时才去调用drawRect。屏幕每一秒刷新30-60秒次,所以1秒调用drawRect方法大概30-60次,速度非常快哦 view内部有个layer(图层)属性,drawRect:方法中取得的是一个Layer Graphics Context,因此,绘制的东西其实是绘制到view的layer上去了 View之所以能显示东西,完全是因为它内部的layer