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并不是负责显示,而是它内部的“层”来负责。
·上面已经说过了,UIView之所以能够显示,完全是因为内部的CALayer对象。
通过操作这个CALayer对象,可以很方便地调整UIView的一些界面属性,比如:
阴影、圆角大小、边框宽度和颜色等。
·CALayer是被定义在QuartzCore框架中的,因此要想使用CALayer,先导入
QuartzCore框架。
·设置边框和边框颜色
·设置阴影
·设置圆角
设置
圆角设置
·设置内容
·使用KVC设置旋转、缩放和平移,好处是,同时设置
x,y,z坐标示意
注意事项
·学习核心动画之前,需要先理解CALayer,因为核心动画操作的对象不是
UIView,而是CALayer
·修改图层相当于修改UIView属性,即修改了界面属性
·每一个View内部都有一个CALayer
·在实现核心动画时,本质上是将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
·学到这里大家不难发现,这个CALayer完全可以替代UIView嘛,他们有着相同
的实现效果
·其实,UIView比Layer多了一个事件处理的功能,即如果你创建的是一个层,那
么这个层本身是不能响应事件的,也不在响应事件者链中存在
·UIView负责事件的处理
·CALayer负责显示、以及动画的处理
·CALayer设计的目的是提供视图的可视化的内容,并不是为了取代UIView
·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为其他值时,以此类推。
·每一个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中的内容转换成位图,从而便于图形
硬件的操纵
- CALayer概念和用法---摘自培训文档
- UIScrollView---摘自培训文档
- 文件管理---摘自培训文档
- 控件学习---UIImageView---摘自培训文档
- 定制单元格tableViewcell和表视图编辑模式---摘自培训文档
- 表视图tableView的使用---摘自培训文档
- CALayer用法
- CALayer中anchorPoint和position的用法
- CALayer中anchorPoint和position的用法
- CALayer中anchorPoint和position的用法
- iOS 官方文档CALayer
- KVO概念和用法
- 数组概念和用法
- Hadoop分布式文件系统:架构和设计(摘自Hadoop官方文档)
- Cocos Creator 创建和销毁节点(摘自官方文档)
- Cocos Creator 访问节点和组件(摘自官方文档)
- Cocos Creator 常用节点和组件接口(摘自官方文档)
- Cocos Creator 加载和切换场景(摘自官方文档)
- ADO.NET 连接 IBM OS/400(System i) 试验记录
- IOS自定义单选框
- Codeforces Round #336 (Div. 2)
- HTTP GET的简单代码实现
- hdu 2602 Bone Collector(01背包)
- CALayer概念和用法---摘自培训文档
- 4.1 Collection,List,Set,Iterator,Map
- linux telnet连接两台内网机器No route to host
- git安装使用 (一)
- iOS正则验证手机号的三种方式
- 彻底理解position和anchorPoint!!!
- Android四大组件之:Activity
- android 网络图片异步加载
- 4.2 File