iOS基础 - CALayer

1、CALayer简介

Core Animation是跨平台的,支持iOS环境和Mac OS X环境框架

凡是支持跨平台的框架,都不能直接使用UIKit框架,由于UIKit框架只能应用在iOS而不能用于Mac函数

须要先理解CALayer,由于核心动画操做的对象是CALayer,而不是UIView性能

CALayer是核心动画的基础,能够作圆角、阴影、边框等效果动画

每一个UIView内部都有一个Layer的属性spa

在实现核心动画时,本质上是将CALayer中的内容转换成位图(一种图像格式),从而便于图形硬件的操纵设计

2、UIViewCALayer基本属性

设置UIView中的CALayer属性orm

圆角、边框、阴影及3D形变属性对象

UIViewCALayer只是一个类声明,须要添加QuartzCore框架游戏

在使用颜色时,不能直接使用UIColor而须要将颜色转成CGColor事件

修改图层至关于修改UIView属性,即修改了界面属性

要设置阴影,须要同时指定阴影的偏移尺寸、颜色和透明度

形变属性既能够用形变函数指定,也能够用keyPath指定

3、UIImageViewCALayer基本属性

设置UIImageView中的CALayer属性

圆角、边框、阴影

UIImageView中不只一个子图层,所以设置圆角时须要使用setMasksToBounds:YES,让全部子图层跟随边框,不过设置该属性后,没法使用阴影效果

能够在底层附加一个UIView实现阴影效果

设置UIImageView中的CALayer属性

transform属性能够调整CALayer的形变,其中包括:旋转、缩放、平移

transform属性的参数查询:CATransform

4、图层和视图之间的关系

建立视图对象时,视图会本身建立一个层,视图在绘图(如drawRect:)时,会将内容画在本身的层上。当视图在层上完成绘图后,系统会将图层拷贝至屏幕(CALayer绘图的上下文是图像,整个画完后,才显示,提早绘制提升性能以及用户体验)。每一个视图都有一个层,每一个图层又能够有多个子层

Layer的设计目的不是为了取代视图,不能基于CALayer建立一个独立的可视化组件

Layer的设计目的是提供视图的基本可视内容,以便提升动画的执行效率

除提供可视内容外,Layer不负责视图的事件响应等工做,同时Layer不能参与到响应者链条中

5、CALayer的使用说明

经过UIViewlayer属性能够拿到对应的根层,这个层不容许从新建立,但能够往层里面添加子层(调用CALayeraddSublayer)

要具体使用CALayer,须要引入<QuartzCore/QuartzCore.h>

获取当前图层或使用静态方法layer初始化CALayer后,能够设置如下属性

bounds:宽度和高度

position:位置(默认指中心点,具体由anchorPoint决定)

anchorPoint:锚点(x,y的范围都是0-1),决定了position的含义

backgroundColor: 背景颜色(CGColorRef类型)

borderColor:边框颜色(CGColorRef类型)

borderWidth:边框宽度

cornerRadius:圆角半径

contents: 内容(好比设置为图片CGImageRef

虽然CALayer可使用frame,但最好仍是使用boundsposition。为层设置动画时,用boundsposition会方便一点

6、建立自定义图层

建立自定义图层,并设置如下属性:

bounds:宽度和高度

backgroundColor: 背景颜色(CGColorRef类型)

position:位置(默认指中点,具体由anchorPoint决定)

anchorPoint:锚点(x,y的范围都是0-1),决定了position的含义

contents:内容CGImageRef

锚点和位置的关系,以及在旋转转换时对图层的影响

UIView有一个addSubview方法,而layer有一个addSubLayer方法

锚点在游戏开发中使用比较频繁,而在应用开发中极少使用

7、CALayer中图像及颜色的注意事项

CALayer中使用CGColorRefCGImageRef的数据类型,而不用UIColorUIImage

QuartzCore(包含CALayer类)和Core Graphics(包含CGImageRefCGColorRef)框架都能在iOSMac OS X上使用,可是UIKit(包含UIImage和其余UI开头的类)只能在iOS中使用

为了保证可移植性,QuartzCore不能使用UIImage,只能使用CGImageRef

不过不少状况下,能够经过UIKit对象的特定方法,能够获得Core Graphics对象,如UIImageCGImage方法和UIColorCGColor方法

8、CALayer的隐式动画属性

每个UIView内部都默认关联着一个CALayer,称这个LayerRoot Layer。全部的非Root Layer都存在着隐式动画,隐式动画的默认时长为1/4秒。

当修改非Root Layer的部分属性时,相应的修改会自动产生动画效果,能执行隐式动画的属性被称为“可动画属性”,诸如:

bounds: 缩放动画

position: 平移动画

opacity: 淡入淡出动画(改变透明度)

在文档中搜素animatable能够找到全部可动画属性

若是要关闭默认的动画效果,能够经过动画事务方法实现:

[CATransaction begin];

[CATransaction setDisableActions:YES];

[CATransaction commit];

9、在CALayer上绘图

要在CALayer上绘图,有两种方法:

建立一个CALayer的子类,而后覆盖drawInContext:方法,可使用Quartz2D API在其中进行绘图

设置CALayerdelegate,而后让delegate实现drawLayer:inContext:方法进行绘图

不能再将UIView设置为这个CALayerdelegate,由于UIView对象已是内部层的delegate,再次设置会出问题

不管使用哪一种方法,都必须向层发送setNeedsDisplay消息,以触发相应绘图方法的调用

10、CALayerUIView以及上下文之间的关系

UIView收到setNeedsDisplay消息时,CALayer会准备好一个CGContextRef,而后向它的delegateUIView,发送消息,而且传入已经准备好的CGContextRef对象。UIViewdrawLayer:inContext:方法中会调用本身的drawRect:方法

平时在drawRect:中经过UIGraphicsGetCurrentContext()获取的就是由CALayer传入的CGContextRef对象,在drawRect:中完成的全部绘图都会填入CALayerCGContextRef中,而后被拷贝至屏幕

CALayerCGContextRef用的是位图上下文(Bitmap Graphics Context

11、获取CALayer中的内容——截屏

UIGraphicsBeginImageContext(self.view.bounds.size);

[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

说明:使用renderInContext方法能够将指定图层及其子图层中的内容渲染输出到指定的上下文中 

相关文章
相关标签/搜索