CALayer

原创 2015年07月10日 13:46:43

CALayer

CALayer是核心动画的基础,因为核心动画操作的对象不是UIView,而是CALayer。在实现核心动画时,本质上是将CALayer中的内容转换成位图,从而便于图像硬件的操纵。

既然核心动画操作的是CALayer,那么CALayer与UIView之间是什么样的关系?

在创建视图时,视图会创建一个图层,该图层作为视图的根图层(根图层不允许用户创建,但可以添加子图层)。视图在绘图时,会将内容画在自己图层上,当视图在层上完成绘图后,系统会将图层拷贝至屏幕。总的来说,UIView与CALayer之间的关系如下:

1)     CALayer并不是要取代视图,因此不能基于CALayer创建一个独立的可视化组件,图层必须依附视图而存在;

2)     CALayer的设计目的是提供视图的基本可视内容,从而提高动画的执行效率;

3)     CALayer除提供可视的内容外,不能响应事件等;

UIView是有层级关系的,同样图层也就有层级关系,也即可以向某个图层中添加子图层,如下图所示:


1、       CALayer属性

获取当前视图的图层后,可以设置图层的下列属性:

1)     bounds:宽度和高度;

2)     position:位置(默认指中心点)

3)     anchorPoint:锚点(xy的范围为0-1);

4)     backgroundColor:背景色;

5)     borderColor:边框颜色;

6)     borderWidth:边框宽度;

7)     cornerRadius:圆角半径;

8)     contents:内容,设置图片;

虽然CALayer可以设置frame属性,但在设置动画时,使用bounds和position会比较方便,其实改变图层的属性值,就相当于改变了UIView对应的属性值。

锚点中的x,y范围为0-1,分别对应图层尺寸的比例(0~100%),通过比例,锚点并不需要知道图层的具体大小,如下图示


那锚点和position到底有怎样的关系呢?总的来说锚点要与position重合。锚点是位于子图层上的点(子图层范围内),而position点是父图层上的点,在设置position时,系统依据“锚点与position重合”来决定子图层的显示范围。

现在假设父图层的大小为整个屏幕大小(假设为320*480),现需要为其添加子图层,假设子图层大小为320*240,并设置子图层的position属性为(0,0),则子图层在父图层显示的区域是多少呢?



可以看到,只显示了子图层的1/4(图1.1)。position值为(0,0),而锚点为(0.5,05)(默认值),由于锚点与position重合,而锚点默认为子图层的中心点,所以position也就相当于子图层的中心点,由此子图层只能显示1/4。

现在改变子图层的锚点值,使其为(0,0.5),则显示如图1.2所示;令锚点为(0,0.5),则显示如图1.3所示;令锚点为(0,0),则显示如图1.4所示;

          

                                        图1.1                                                                                                       图1.2

             

 

                                    图1.2                                                                                                     图1.3

注意:

1)     在关节动画中可以移动锚点,保证肢体不会分离;

2)     CALayer中使用CGColorRef和CGImageRef数据类型。QuartzCore和CoreGraphics框架可以在iOS和Mac OSX上使用,而UIKit只能在iOS中使用,为了保证可移植性,QuartzCore不能使用UIImage,UIColor等Foundation数据类型;

2、       CALayer隐式动画

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

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

1)     bounds:缩放动画;

2)     position:平移动画;

3)     opacity:淡入淡出(改变透明度);

4)     …;

如果要关闭默认的动画效果,可以通过动画事务的方法,如下:

    [CATransaction begin];

    [CATransaction setDisableActions:YES];

    //属性操作....

[CATransaction commit];

3、       CALayer绘图

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

1)     创建一个CALayer的子类,覆盖drawInContext:方法,可以使用Quartz2DAPI在其中绘图;

2)     设置CALayer的delegate,然后让delegate实现drawLayer:inContext:方法;

注意:

1)     不能再将UIView设置为自定义CALayerdelegate,因为UIView对象已经是Root Layerdelegate

2)     无论使用那种绘图方法,都必须向层显示发送setNeedsDisplay消息,以触发相应的绘图方法;

CALayer、UIView以及上下文之间关系:

1)     当UIView收到setNeedsDisplay消息时,CALayer会准备好一个CGContextRef,然后向它的delegate即UIView发送消息,并且传入已准备好的CGContextRef对象。UIView在drawLayer:inContext:方法中会隐式调用自己的drawRect:方法;

2)     在UIView的drawRect:方法中通过UIGraphicsGetCurrentContext()获取的上下文就是CALayer传入的CGContextRef对象,在drawRect:中完成的所有绘图都会填入CALayer的CGContextRef中,然后被拷贝至屏幕(类似于双缓冲);

3)     CALayer的CGContextRef用的是位图上下文(Bitmap GraphicsContext);

 

 

 

 

 

相关文章推荐

CALayer的基本使用demo

  • 2015年12月01日 03:12
  • 48KB
  • 下载

IOS_CALayer基本使用

  • 2015年05月23日 08:45
  • 409B
  • 下载

使用CAlayer实现动画效果

定义控件1.定义一个视图用来显示动画(aView) self.aView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 175, 175)]...

CALayer及其子类

  • 2016年01月05日 16:51
  • 3MB
  • 下载

CALayer的使用

  • 2015年04月01日 10:35
  • 40KB
  • 下载

IOS 特性CALayer的使用

在IOS的开发中,经常需要针对大量的UIViews进行个性化定制,这样的空间包括Button、Label、slider、web view  and so on。几乎UIView的子类都可能会遇到个性化...

CALayer制作进度条

  • 2015年11月08日 19:36
  • 978KB
  • 下载

CALayer samplecode

  • 2011年06月01日 13:42
  • 289KB
  • 下载

CALayer画多边形柱体

之前做过可以使用Calyer去绘图,这次使用Calyer直接绘出3D立体的柱状体; 整体思路如下:首先初始化一个mainalyer作为主layer,然后在mainlayer上面添加柱状体的一个一个的...

图层CALayer的一些知识

  • 2014年12月15日 14:23
  • 35KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CALayer
举报原因:
原因补充:

(最多只允许输入30个字)