在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. win8中如何禁用屏幕旋转的快捷键

    程序员通常会使用ctrl+alt+方向键 里编辑代码,特别对于使用eclipse的程序员,更是如此,但是win8却把这一快捷键给占用了,很不爽,如何办,很简单.直接上图: 2.但是发现禁用之后并没有解 ...

  2. ImportError: No module named _winreg

    在Flask项目部署到linux上时出现了一个问题,但是在windows上是好的,没有问题.以下是bug Traceback (most recent call last): File "f ...

  3. 修改Input中Placeholder默认提示颜色(兼容)

    input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { color: #f00; } input:-moz-pl ...

  4. socket 套接字

    网络:交换机,路由器,网线 交换机:分配.. 路由器:找寻网络线路 网络架构: 应用层 ---> 表示层 ---> 会话层 ---> 传输层 ---> 网络层 ---> ...

  5. Codeforces Round #265 (Div. 1) C. Substitutes in Number dp

    题目链接: http://codeforces.com/contest/464/problem/C J. Substitutes in Number time limit per test 1 sec ...

  6. 04.Hibernate一对一关联

        前言:本文主要介绍使用Hibernate映射一对一的关联关系的两种方式:使用外键映射.使用主键映射. 1.数据库表的一对一关联关系     本文根据客户信息表(tb_customer)和地址信 ...

  7. 省选加油>_<

    今天没有写题诶……看了看以前的模板……明天就要省选了>_<加油~~ 要不再去打局dota吧>_>

  8. 【BZOJ】【4010】【HNOI2015】菜肴制作

    拓扑排序 这题是要求N个点的一个拓扑序,且满足以下条件:编号1的位置尽可能靠前,在此基础上编号2的位置尽可能靠前…… 我看到这题的第一感觉:将拓扑排序用的队列改为优先队列,编号越小越早出来. 但是连样 ...

  9. Net数值计算MathNet.Numerics类库

    一.Net自带的数值计算:System.Numerics 1.大整数BitInteger 方法:除数和余数.最大公约数 2.复数Complex 属性:实部.虚部.量值.相位 方法:共轭.倒数 二.Ma ...

  10. angularJs 问题

    1. IE不能渲染指令中的 style="background-color",而chrome和firefox可以 <!DOCTYPE html> <html ng ...