在CALayer上绘图:

•要在CALayer上绘图,有两种方法:
1.创建一个CALayer的子类,然后覆盖drawInContext:方法,可以使用Quartz2D API在其中进行绘图
2.设置CALayer的delegate,然后让delegate实现drawLayer:inContext:方法进行绘图
•注意:
–不能再将UIView设置为这个CALayer的delegate,因为UIView对象已经是内部层的delegate,再次设置会出问题
–无论使用哪种方法,都必须向层发送setNeedsDisplay消息,以触发相应绘图方法的调用
 
CALayer、UIView以及上下文之间的关系 :
•当UIView收到setNeedsDisplay消息时,CALayer会准备好一个CGContextRef,然后向它的delegate即UIView,发送消息,并且传入已经准备好的CGContextRef对象。UIView在drawLayer:inContext:方法中会调用自己的drawRect:方法
•平时在drawRect:中通过UIGraphicsGetCurrentContext()获取的就是由CALayer传入的CGContextRef对象,在drawRect:中完成的所有绘图都会填入CALayer的CGContextRef中,然后被拷贝至屏幕
•CALayer的CGContextRef用的是位图上下文(Bitmap Graphics Context)
 
下面我们就对这两种绘图方式都进行具体的实例演示:
 
方式一:通过设置CALayer的代理,并实现代理方法drawLayer:inContext:的形式进行绘图
//在-(void)viewDidLoad{[super viewDidLoad];.......}的代码为:
创建子层:

    //创建子层(使用默认的锚点)
CALayer *subLayer = [[CALayer alloc]init]; subLayer.bounds = CGRectMake(,,, ); subLayer.position = self.view.center; subLayer.backgroundColor = [[UIColor redColor]CGColor];

//设置圆角半径,设置为50,此时的子层为圆形
subLayer.cornerRadius = ; [self.view.layer addSublayer:subLayer];
设置代理

    //设置层的代理
subLayer.delegate = self;
发送重绘消息

    //只有发送setNeedsDisplay这个消息时才会调用代理方法
[subLayer setNeedsDisplay];
//实现代理的drawLayer:inContext:方法代码为:
#pragma mark -CALayer的代理方法
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
//画矩形
CGContextAddRect(ctx, CGRectMake(, , , ));

//设置颜色
CGFloat components[] = {0.0,1.0,0.0,1.0};
CGContextSetStrokeColor(ctx, components); //这种方式也可以设置颜色
//CGContextSetStrokeColorWithColor(ctx,[[UIColor greenColor]CGColor]);
//旋转坐标系
CGContextScaleCTM(ctx, , -);
CGContextTranslateCTM(ctx, , -); //画笑脸图像
UIImage *image = [UIImage imageNamed:@"1.png"];
CGContextDrawImage(ctx, CGRectMake(, , , ), [image CGImage]); //画路径
CGContextDrawPath(ctx, kCGPathStroke);
}
演示结果如下:在子层中画了一个笑脸图像,同时左上角画了一个描绿边的矩形
 
 
方式二:通过创建CALayer的子类,并重写drawInContext:方法进行绘图
//首先在控制器类的-(void)viewDidLoad{[super viewDidLoad];.......}方法中创建子层的代码为:

#import "ViewController.h"
#import "MyLayer.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; //创建子层
MyLayer *myLayer = [[MyLayer alloc]init];
myLayer.bounds = CGRectMake(, , , ); myLayer.position = CGPointMake(, );

//设置子层背景色为灰色
myLayer.backgroundColor = [[UIColor grayColor]CGColor]; [self.view.layer addSublayer:myLayer]; [myLayer setNeedsDisplay];
}
@end
//然后创建一个CALayer的子类,在类中冲重写drawInContext:方法,代码如下:

#import "MyLayer.h"
#import <UIKit/UIKit.h> @implementation MyLayer
//重写这个方法
-(void)drawInContext:(CGContextRef)ctx
{ //绘制矩形
CGContextAddRect(ctx, CGRectMake(, , , )); //第一种设置颜色方式:
//设置颜色空间(选择配色方案:RGB,红、绿、蓝)
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGContextSetStrokeColorSpace(ctx, colorspace);

//数组中四个内容:前三个分别为红绿蓝颜色值,后一个为透明度
CGFloat components[] = {0.0,1.0,0.0,1.0};
CGContextSetStrokeColor(ctx, components); //这是另一种比较简单的设置颜色的方式
//CGContextSetStrokeColorWithColor(ctx, [[UIColor greenColor]CGColor]); //绘制描边路径
CGContextDrawPath(ctx, kCGPathStroke); //释放create出的属性,防止内存泄露
CGColorSpaceRelease(colorspace);
}
@end
演示结果如下:产生了一个灰色的layer子层,在上面画了一个只描可绿边的矩形
 

iOS:CALayer核心动画层上绘图的更多相关文章

  1. iOS:CALayer核心动画层

    CALayer:核心动画层 简介: Core Animation 是跨平台的,支持iOS环境和Mac OS X环境 学习核心动画之前,需要先理解CALayer,因为核心动画操作的对象不是UIView, ...

  2. iOS学习——核心动画

    iOS学习——核心动画 1.什么是核心动画 Core Animation(核心动画)是一组功能强大.效果华丽的动画API,无论在iOS系统或者在你开发的App中,都有大量应用.核心动画所在的位置如下图 ...

  3. iOS学习——核心动画之Layer基础

    iOS学习——核心动画之Layer基础 1.CALayer是什么? CALayer我们又称它叫做层.在每个UIView内部都有一个layer这样一个属性,UIView之所以能够显示,就是因为它里面有这 ...

  4. iOS:核心动画之基本动画CABasicAnimation

    基本动画,是CAPropertyAnimation的子类 属性说明: fromValue:keyPath相应属性的初始值 toValue:keyPath相应属性的结束值 动画过程说明: 随着动画的进行 ...

  5. IOS QuartzCore核心动画框架

    IOS QuartzCore核心动画框架 核心动画框架 使用核心动画需要引入的框架:#import CALayer: CoreAnimation CALayer就是UIView上的图层,很多的CALa ...

  6. ios开发核心动画七:核心动画与UIView动画的区别

    /** UIView与核心动画区别?(掌握) 1.核心动画只作用在layer. 2.核心动画看到的都是假像,它并没有去修改UIView的真实位置. 什么时候使用核心动画? 1.当不需要与用户进行交互, ...

  7. iOS之核心动画(Core Animation)

      Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能. Core ...

  8. iOS:核心动画的详解介绍:CAAnimation(抽象类)及其子类

    核心动画的详解介绍:CAAnimation(抽象类)   1.核心动画基本概念 Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍! 使用它 ...

  9. iOS基础 - 核心动画

    一.核心动画 l 核心动画基本概念 l 基本动画 l 关键帧动画 l 动画组 l 转场动画 l Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事 ...

随机推荐

  1. ostream类重载的operator<<()函数

    ostream类重载了operator<<()以识别不同的类型,如: int short  long unsigned int unsigned short unsigned long f ...

  2. Window VNC远程控制LINUX:VNC详细配置介绍

    Window VNC远程控制LINUX:VNC详细配置介绍 //---------------------------------------vnc linux下的详细配置 1.VNC的启动/停止/重 ...

  3. Mac下安装及配置Eclipse

    1.安装Eclipse前先确认你的Mac上是否已安装java运行环境.进入终端,输入”java -version”,如果返回了java版本号则说明已安装,否则,请先安装java运行环境: 2.访问ec ...

  4. java笔记之变量的存储方式

    1.java变量存储域 java变量的存储区域主要放在以下几个地方: (1)寄存器:可以说是最快的存储区,在C/C++中可以声明寄存器变量,但是在java中不能声明寄存器变量,只是编译器在编译时确定. ...

  5. [转载]linux sed命令详解

    简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...

  6. File "/struts-tags" not found

    前言 由于在某个jsp引用了struts标签库,导致该错误产生--这是stuts项目算是一道经典错误,往往最后的解决方式是更换Tomcat.今天我记录的是引起这一错误的一个非常隐藏的原因. 错误描述 ...

  7. 【POJ】【1821】Fence

    DP/单调队列优化 题意:k个人粉刷总长为n的墙壁(或者说栅栏?),每个人有一个必刷点s[i](这个人也可以一点也不刷,如果刷就必须刷这个点),最大粉刷长度l[i](必须是连续粉刷一段),和粉刷一格的 ...

  8. StoreKit framework

    关于In-APP Purchase 1. 中文文档 基本流程: http://www.cnblogs.com/wudan7/p/3621763.html 三种购买形式及StoreKit code介绍: ...

  9. [译]如何使用 Docker 组件开发 Django 项目?

    原文地址:Django Development With Docker Compose and Machine 以下为译文 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包 ...

  10. 接口、抽象类、方法复写、类Equals方法重写

    接口: /* * Java接口中的數據成員必須初始化,該成員有隱藏的final.satic.常量, * 一次賦值后不可在賦值 * 成員方法訪問修飾符必須是公共修飾符,可以顯示聲明也可以不聲明 * 成員 ...