在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. BF算法

    BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符:若不相等,则比较S的第二个字符和P的第一个字符, ...

  2. Windows Phone 8 实现列表触底加载

    [背景] 很多时候在做WP开发的过程中会遇到数据需要分页获取,根据微软官方的推荐方式,建议实现为Market中类似的体验,即滑动到列表的底部的时候加载更多的数据. 这一需求在早起WP7.1时代实现起来 ...

  3. Codeforces Round #354 (Div. 2) C. Vasya and String

    题目链接: http://codeforces.com/contest/676/problem/C 题解: 把连续的一段压缩成一个数,对新的数组求前缀和,用两个指针从左到右线性扫一遍. 一段值改变一部 ...

  4. zepto判断手机横竖屏

    var CheckOrientation = (function(){ var win = $( window ), get_orientation, last_orientation, initia ...

  5. 二分图匹配(KM算法)n^4 分类: ACM TYPE 2014-10-04 11:36 88人阅读 评论(0) 收藏

    #include <iostream> #include<cstring> #include<cstdio> #include<cmath> #incl ...

  6. C#单链表(数据结构)

    学习单链表的源码项目:http://files.cnblogs.com/xmfdsh/CSharp%E5%8D%95%E9%93%BE%E8%A1%A8.rar 链表是用一组任意的存储单元来存储线性表 ...

  7. Eclipse Plugin for Hadoop

    Eclipse 官网下载向导 下载 下载的安装文件放到~/setupEnv,将安装到/opt目录下 cd ~/setupEnv sudo tar zxvf eclipse-java-kepler-SR ...

  8. 《深入浅出JavaScript》

    第一章JS入门 第二章数据和判定常用的转义序列\b 回退 \f换页 \n换行 \r回车 \t制表符 \'单引 \"双引 \\反斜乘除求余的优先级相同,从左向右执行string对象indexO ...

  9. asp.net MVC3 + JQuery 的ajax简单使用

    一直都没有使用过JQuery,更没使用过JQuery的ajax支持带来的方便,今天试了一下,真是减少了很多工作量,使用方法也比较简单 这里先记下来,以后使用时可以再拿着用. 本应用中,本来是准备使用长 ...

  10. C# 对委托的BeginInvoke,EndInvoke 及Control 的BeginInvoke,EndInvoke 的理解

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...