CALayer概念和用法---摘自培训文档

来源:互联网 发布:mac怎么强制关掉进程 编辑:程序博客网 时间:2024/06/05 18:24

1 什么是CALayer

·在iOS开发中,一般你所看得见摸得着的东西,都是UIView(至少,目前是这样)
Core Animation
·UIView之所以能够显示,完全是因为一个“层”的概念,或者说每一个UIView
都有一个层(SDK中,每一个UIView都有一个只读的Layer属性
·然而,再之前的开发中,我们创建UIView(以及它的子类),是自然而然的,换
句话说是自然而然显示的。也就是说UIView会自动创建CALayer对象用于显示
·过程是什么呢? 当我们创建一个UIView时,这个视图会调用drawRect:的方
法,进行绘图,将内容绘制到“层”上,然后,iOS系统会将层拷贝到屏幕中去,
于是这个视图我们就“看见”了
·本质是什么?UIView并不是负责显示,而是它内部的“层”来负责


2 CALayer的简单使用
·上面已经说过了,UIView之所以能够显示,完全是因为内部的CALayer对象。
通过操作这个CALayer对象,可以很方便地调整UIView的一些界面属性,比如:
阴影、圆角大小、边框宽度和颜色等。
·CALayer是被定义在QuartzCore框架中的,因此要想使用CALayer,先导入
QuartzCore框架。
·设置边框和边框颜色


·设置阴影

·设置圆角
设置

圆角设置


·设置内容


·设置旋转、缩放以及平移

·使用KVC设置旋转、缩放和平移,好处是,同时设置

x,y,z坐标示意



注意事项
·学习核心动画之前,需要先理解CALayer,因为核心动画操作的对象不是
UIView,而是CALayer
·修改图层相当于修改UIView属性,即修改了界面属性
·每一个View内部都有一个CALayer
·在实现核心动画时,本质上是将CALayer中的内容转换成位图,从而便于图形硬
件的操纵


3 创建一个CALayer
·UIView内部默认有个CALayer对象(层),通过layer属性可以访问这个层。要注
意的是,这个默认的层不允许重新创建,但可以往层里面添加子层
·UIView可以通过addSubview:方法添加子视图,同理,CALayer可以通过
addSublayer:方法添加子层


添加一个简单的图层

图片的图层

CGColorRef和CGImageRef这2种数据类型
·为什么使用CGColorRef和CGImageRef这2种数据类型
·CALayer是定义在QuartzCore框架中的;CGImageRef、CGColorRef两种数据类
型是定义在CoreGraphics框架中的;UIColor、UIImage是定义在UIKit框架中的
·其次, QuartzCore框架和CoreGraphics框架是可以跨平台使用的(不能跨
window,苹果内部),在iOS和Mac OS X上都能使用,但是UIKit只能在iOS中使用
·为了保证可移植性,QuartzCore不能使用UIImage、UIColor,只能使用
CGImageRef、CGColorRef
·可以通过UIKit框架的特定方法,得到CoreGraphics对象,比如UIImage的
CGImage方法可以返回一个CGImageRef


UIView和Layer的选择
·学到这里大家不难发现,这个CALayer完全可以替代UIView嘛,他们有着相同
的实现效果
·其实,UIView比Layer多了一个事件处理的功能,即如果你创建的是一个层,那
么这个层本身是不能响应事件的,也不在响应事件者链中存在
·UIView负责事件的处理
·CALayer负责显示、以及动画的处理
·CALayer设计的目的是提供视图的可视化的内容,并不是为了取代UIView


UIView和CALayer的关系
·UIView可以通过subviews属性访问所有的子视图,类似地,CALayer也可以通
过sublayers属性访问所有的子层
· UIView可以通过superview属性访问父视图,类似地,CALayer也可以通过
superLayer属性访问父层



position和anchorPoint,位置与锚点
·position和anchorPoint属性都是CGPoint类型的
·position可以用来设置CALayer在父层中的位置,它是以父层的左上角为坐标原
点(0, 0)
·anchorPoint称为"定位点",它决定着CALayer身上的哪个点会在position属性
所指的位置。它的x、y取值范围都是0~1,默认值为(0.5, 0.5)
·anchorPoint决定着CALayer身上的哪个点会在position所指定的位置上。它的
x、y取值范围都是0~1,默认值为(0.5, 0.5),因此,默认情况下,CALayer的中
点会在position所指定的位置上。当anchorPoint为其他值时,以此类推。


4 CALayer隐式动画
·每一个UIView内部都默认关联着一个CALayer,我们可用称这个Layer为Root
Layer(根层)。所有的非Root Layer,也就是手动创建的CALayer对象,都存在
着隐式动画,
隐式动画的默认时长为1/4秒
·当修改非Root Layer的部分属性时,相应的修改会自动产生动画效果,能执行隐
式动画的属性被称为“可动画属性”,诸如:
·bounds: 缩放动画
·position: 平移动画
·opacity: 淡入淡出动画(改变透明度)
·backgroundColor transform.rotation.z
·在文档中搜素animatable可以找到所有可动画属性


常见随机数
·常见随机数

5 自定义CALayer(1)
·创建一个CALayer的子类,然后覆盖drawInContext:方法,使用Quartz2D API
进行绘图


·需要调用setNeedsDisplay这个方法,才会触发drawInContext:方法的调用,
然后进行绘图


自定义CALayer(2)
·设置CALayer的delegate,然后让delegate实现drawLayer:inContext:方法,
当CALayer需要绘图时,会调用delegate的drawLayer:inContext:方法进行绘图
·注意:不能再将某个UIView设置为CALayer的delegate,因为UIView对象已经
是它内部根层的delegate,再次设置为其他层的delegate就会出问题。


·代理方法的实现

UIView如何显示?
·当UIView需要显示时,它内部的层会准备好一个CGContextRef(图形上下文),
然后调用delegate(这个地方是UIView)的drawLayer:inContext:方法,并且传入
已经准备好的CGContextRef对象。而UIView在drawLayer:inContext:方法中又
会调用自己的drawRect:方法。这就是为什么我们子类化一个View会调用
drawRect:方法的原因
·在drawRect:中通过UIGraphicsGetCurrentContext()获取的就是由层传入的
CGContextRef对象,所有的绘图都会被填入到CGContextRef中(上下文),当
绘制完成时(层),iOS将其拷贝到屏幕上。


本节知识点回顾
·每个UIView内部都有一个Layer的属性
·要具体使用CALayer,需要引入<QuartzCore/QuartzCore.h>
·CALayer中使用CGColorRef和CGImageRef的数据类型,
而不用UIColor和
UIImage
·所有的非Root Layer都存在着隐式动画
·创建一个CALayer的子类,然后覆盖drawInContext:方法,可以使用
Quartz2D API在其中进行绘图
·在实现核心动画时,本质上是将CALayer中的内容转换成位图,从而便于图形
硬件的操纵


0 0