使用Quartz2D API进行绘图

一、自定义层的方法1

1.创建一个 CALayer 的子类

2.在. m 文件中覆盖 drawInContext:方法,在里面绘图

- (void)drawInContext:(CGContextRef)ctx {
 5     // 设置为蓝色
 6     CGContextSetRGBFillColor(ctx, 0, 0, 1, 1);
 7
 8
 9     // 设置起点
10     CGContextMoveToPoint(ctx, 50, 0);
11     // 从(50, 0)连线到(0, 100)
12     CGContextAddLineToPoint(ctx, 0, 100);
13     // 从(0, 100)连线到(100, 100)
14     CGContextAddLineToPoint(ctx, 100, 100);
15     // 合并路径,连接起点和终点
16     CGContextClosePath(ctx);
17
18     // 绘制路径
19     CGContextFillPath(ctx);
20 }

3.在控制器中添加图层到屏幕上

2 // 设置层的宽高
3 layer.bounds = CGRectMake(0, 0, 100, 100);
4 // 设置层的位置
5 layer.position = CGPointMake(100, 100);
6 // 开始绘制图层
7 [layer setNeedsDisplay];    注意 //使用此方法才会触发 drawInContext 方法
8 [self.view.layer addSublayer:layer];

二、自定义层的方法2

方法描述:设置CALayer的delegate,然后让delegate实现drawLayer:inContext:方法,当CALayer需要绘图时,会调用delegate的drawLayer:inContext:方法进行绘图。

* 这里要注意的是:不能再将某个UIView设置为CALayer的delegate,因为UIView对象已经是它内部根层的delegate,再次设置为其他层的delegate就会出问题。UIView和它内部CALayer的默认关系图:

1.创建新的层,设置delegate,然后添加到控制器的view的layer中

1 CALayer *layer = [CALayer layer];
 2 // 设置delegate
 3 layer.delegate = self;
 4 // 设置层的宽高
 5 layer.bounds = CGRectMake(0, 0, 100, 100);
 6 // 设置层的位置
 7 layer.position = CGPointMake(100, 100);
 8 // 开始绘制图层
 9 [layer setNeedsDisplay];
10 [self.view.layer addSublayer:layer];

* 在第3行设置了CALayer的delegate,这里的self是指控制器

* 注意第9行,需要调用setNeedsDisplay这个方法,才会通知delegate进行绘图

2.让CALayer的delegate(前面设置的是控制器)实现drawLayer:inContext:方法

 1 #pragma mark 画一个矩形框
 2 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
 3     // 设置蓝色
 4     CGContextSetRGBStrokeColor(ctx, 0, 0, 1, 1);
 5     // 设置边框宽度
 6     CGContextSetLineWidth(ctx, 10);
 7
 8     // 添加一个跟层一样大的矩形到路径中
 9     CGContextAddRect(ctx, layer.bounds);
10
11     // 绘制路径
12     CGContextStrokePath(ctx);
13 } 

无论采取哪种方法来自定义层,都必须调用CALayer的setNeedsDisplay方法才能正常绘图。

* 当UIView需要显示时,它内部的层会准备好一个CGContextRef(图形上下文),然后调用delegate(这里就是UIView)的drawLayer:inContext:方法,并且传入已经准备好的CGContextRef对象。而UIView在drawLayer:inContext:方法中又会调用自己的drawRect:方法

* 平时在drawRect:中通过UIGraphicsGetCurrentContext()获取的就是由层传入的CGContextRef对象,在drawRect:中完成的所有绘图都会填入层的CGContextRef中,然后被拷贝至屏幕

      CV模式代码----(感谢http://www.cnblogs.com/mjios/archive/2013/04/14/3020975.html)

时间: 2024-10-13 20:41:10

使用Quartz2D API进行绘图的相关文章

iOS开发UI篇—Quartz2D使用(绘图路径)

iOS开发UI篇-Quartz2D使用(绘图路径) 一.绘图路径 A.简单说明 在画线的时候,方法的内部默认创建一个path.它把路径都放到了path里面去. 1.创建路径  cgmutablepathref 调用该方法相当于创建了一个路径,这个路径用来保存绘图信息. 2.把绘图信息添加到路径里边. 以前的方法是点的位置添加到ctx(图形上下文信息)中,ctx 默认会在内部创建一个path用来保存绘图信息. 在图形上下文中有一块存储空间专门用来存储绘图信息,其实这块空间就是CGMutablePa

Quartz2D使用(绘图路径)

Quartz2D使用(绘图路径) 一.绘图路径 A.简单说明 在画线的时候,方法的内部默认创建一个path.它把路径都放到了path里面去. 1.创建路径  cgmutablepathref 调用该方法相当于创建了一个路径,这个路径用来保存绘图信息. 2.把绘图信息添加到路径里边. 以前的方法是点的位置添加到ctx(图形上下文信息)中,ctx 默认会在内部创建一个path用来保存绘图信息. 在图形上下文中有一块存储空间专门用来存储绘图信息,其实这块空间就是CGMutablePathRef. 3.

封装CoreGraphics的API简化绘图操作

效果 说明 1. 将CoreGraphics的API接口抽象为对象,让绘图变得简单易懂 2. 简化常用的绘制操作 3. 源码长期更新 源码 https://github.com/YouXianMing/CGContextObject // // CGContextObject.h // DrawRect // // Created by YouXianMing on 15/7/2. // Copyright (c) 2015年 YouXianMing. All rights reserved.

Win32 API之绘图函数

AbortPath 抛弃选入指定设备场景中的所有路径.也取消目前正在进行的任何路径的创建工作 AngleArc 用一个连接弧画一条线 Arc 画一个圆弧 BeginPath 启动一个路径分支 CancelDC 取消另一个线程里的长时间绘图操作 Chord 画一个弦 CloseEnhMetaFile 关闭指定的增强型图元文件设备场景,并将新建的图元文件返回一个句柄 CloseFigure 描绘到一个路径时,关闭当前打开的图形 CloseMetaFile 关闭指定的图元文件设备场景,并向新建的图元文

八、Quartz2D

1.基本图形绘制 >>绘图步骤 > 获取图形上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); > 拼接路径 // 设置起点 CGContextMoveToPoint(ctx, 10, 10); // 设置终点 CGContextMoveToPoint(ctx, 100, 100); CGContextAddLineToPoint该方法会将当前图形上下文的起点链接一条线到指定点 CGContextAddLineToPoint(

CALayer4-自定义层

一.自定义层的方法1 方法描述:创建一个CALayer的子类,然后覆盖drawInContext:方法,使用Quartz2D API进行绘图 1.创建一个CALayer的子类 2.在.m文件中覆盖drawInContext:方法,在里面绘图 1 @implementation MJLayer 2 3 #pragma mark 绘制一个实心三角形 4 - (void)drawInContext:(CGContextRef)ctx { 5 // 设置为蓝色 6 CGContextSetRGBFill

CALayer05-自定义图层

一.UIView和CALayer的其他关系 * UIView可以通过subviews属性访问所有的子视图,类似地,CALayer也可以通过sublayers属性访问所有的子层 * UIView可以通过superview属性访问父视图,类似地,CALayer也可以通过superlayer属性访问父层 如果两个UIView是父子关系,那么它们内部的CALayer也是父子关系. 二.自定义图层方法一 1.方法描述:创建一个CALayer的子类,然后覆盖drawInContext:方法,使用Quartz

李洪强-CALayer4-自定义层

自定义层,其实就是在层上绘图,一共有2种方法,下面详细介绍一下. 一.自定义层的方法1 方法描述:创建一个CALayer的子类,然后覆盖drawInContext:方法,使用Quartz2D API进行绘图 1.创建一个CALayer的子类 2.在.m文件中覆盖drawInContext:方法,在里面绘图 1 @implementation MJLayer 2 3 #pragma mark 绘制一个实心三角形 4 - (void)drawInContext:(CGContextRef)ctx {

OC语言知识10

本文目录 一.自定义层的方法1 二.自定义层的方法2 三.其他 自定义层,其实就是在层上绘图,一共有2种方法,下面详细介绍一下. 回到顶部 一.自定义层的方法1 方法描述:创建一个CALayer的子类,然后覆盖drawInContext:方法,使用Quartz2D API进行绘图 1.创建一个CALayer的子类 2.在.m文件中覆盖drawInContext:方法,在里面绘图 1 @implementation MJLayer 2 3 #pragma mark 绘制一个实心三角形 4 - (v