CALayer及其子类

前言:这个系列要更新Core Animation的内容,但是CALayer是Core Animation的基础。

一 CALayer是什么?

摘自官网的一句话-Layers Provide the Basis for Drawing and Animations(Layers是绘图和动画的基础)

Layer是在3D空间中的2D平面。Layer管理的几何(例如rotate,transfrom),内容(image等),和可视属性 (backgroundColor,alpha)等信息。Layer主要通过管理bitmap来维护自己的状态信息,从这一点上来说,Layer可以看作 对象模型,因为他们主要用来管理数据。

Layer是基于bitmap的,它会捕获View要呈现的内容,然后cache在一个bitmap中,这个bitmap可以看作一个对象。这样每次进行操作,例如平移旋转等,只是bitmap的矩阵运算。基于Layer的动画过程如图

由于基于Layer的绘制是处理静态的Bitmap的,而bitmap的处理又是GPU所擅长的,所以它的效率要比基于View绘制的高很多,因为基于View绘制的每次都要进行drawRect的调用重新绘制。

二 Layer支持继承,支持添加Sublayer,支持对sublayer进行层次调整

常用的Layer子类


CAEmitterLayer


发射器层,用来控制粒子效果


CAGradientLayer


梯度层,颜色渐变


CAEAGLayer


用OpenGL ES绘制的层


CAReplicationLayer


用来自动复制sublayer


CAScrollLayer


用来管理可滑动的区域


CAShapeLayer


绘制立体的贝塞尔曲线


CATextLayer


可以绘制AttributeString


CATiledLayer


用来管理一副可以被分割的大图


CATransformLayer


用来渲染3D layer的层次结构

管理Layer内容的几个函数

addSublayer:

insertSublayer:above:

insertSublayer:atIndex:

insertSublayer:below:

removeFromSuperlayer

replaceSublayer:with:

三 直接设置UIView的Layer

先看一个示例,然后我会列出常用的属性,最后就某几个比较不容易理解的属性单独分析。

先在Stroyboard上拖拽一个UIView,然后control+drag出一个IBOutlet,命名为containView

@property (weak, nonatomic) IBOutlet UIView *containView;

然后,在ViewDidLoad中,键入如下代码

   containView.layer.backgroundColor = [UIColor lightGrayColor].CGColor;//背景色
    containView.layer.cornerRadius = 20.0;//圆角
    containView.layer.shadowColor = [UIColor blueColor].CGColor;//阴影颜色
    containView.layer.shadowOpacity = 0.8;//阴影透明度
    containView.layer.shadowOffset = CGSizeMake(3.0, 3.0);//阴影的偏移量
    containView.layer.borderColor = [UIColor redColor].CGColor;//边界颜色
    containView.layer.borderWidth = 2;//边界宽度

这样,运行后的效果如图

四 添加Sublayer

   containView.layer.backgroundColor = [UIColor lightGrayColor].CGColor;
    containView.layer.cornerRadius = 20.0;
    containView.layer.shadowColor = [UIColor blueColor].CGColor;
    containView.layer.shadowOpacity = 0.8;
    containView.layer.shadowOffset = CGSizeMake(3.0, 3.0);
    containView.layer.borderColor = [UIColor redColor].CGColor;
    containView.layer.borderWidth = 2;

    CALayer * sublayer1 = [CALayer layer];
    sublayer1.backgroundColor = [UIColor blueColor].CGColor;
    sublayer1.frame = CGRectMake(0, 0,80,80);
    sublayer1.anchorPoint = CGPointMake(0.5, 0.5);
    sublayer1.position = CGPointMake(100,100);
    [containView.layer addSublayer:sublayer1];

效果图如图

有可能添加Sublayer的时候,sublayer的frame范围已经超过了super Layer的frame,那么会怎么样呢?

    sublayer1.position = CGPointMake(0,CGRectGetMaxY(containView.bounds)-10);

修改sublayer1的位置,然后效果如图

但是,很多时候我们并不想sublayer的范围超出 super layer,这时候可以设置这个属性

    containView.layer.masksToBounds = YES;

效果如图

这里再听过两个常用的CALayer的子类UIShapeLayer和UITextLayer的示例

    CAShapeLayer * shapeLayer = [CAShapeLayer layer];
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path,nil,0.0,0);
    CGPathAddLineToPoint(path,nil,0.0,CGRectGetHeight(containView.bounds)/2);
    shapeLayer.path = path;
    shapeLayer.bounds = CGRectMake(0,0,5.0,CGRectGetHeight(containView.bounds)/2);
    shapeLayer.anchorPoint = CGPointMake(0.5, 0.5);
    shapeLayer.position = CGPointMake(CGRectGetMidX(containView.bounds),CGRectGetMidY(containView.bounds));
    shapeLayer.lineWidth = 5.0;
    shapeLayer.lineCap = kCALineCapRound;
    shapeLayer.strokeColor = [UIColor yellowColor].CGColor;
    [containView.layer addSublayer:shapeLayer];

    CATextLayer * textLayer = [CATextLayer layer];
    NSString * text = @"blog.csdn.net/hello_hwc";
    NSAttributedString * attributeString = [[NSAttributedString alloc] initWithString:text];
    textLayer.string = text;
    textLayer.alignmentMode = @"center";
    textLayer.fontSize = 12;
    textLayer.foregroundColor = [UIColor brownColor].CGColor;
    CGRect bounds;
    bounds.origin = CGPointMake(0, 0);
    bounds.size = attributeString.size;
    textLayer.bounds = bounds;
    textLayer.position = CGPointMake(100,100);
    [containView.layer addSublayer:textLayer];

效果图如图

五 anchorPoint和position

和UIView不同,Layer主要由三个属性来设置位置(极少用Frame):

bounds -
设置大小

anchorPoint -设置锚点(锚点对后续的layer动画有很大影响)

position -
锚点在superLayer中的位置

这样说有点抽象,我们看看以下的图就了解了

对于IOS来说,坐标系如图,archPoint(x,y)的两个值通常取0.0-1.0,默认值是(0.5,0.5)这里的值可以看作所占用x的比例,比如默认的0.5,0.5就是在x的中间和y的中间。

而position则是AnchorPoint在super layer中的位置

如下图

五 Layer显示图片

    CALayer * imageLayer = [CALayer layer];
    imageLayer.bounds = CGRectMake(0,0,200,100);
    imageLayer.position = CGPointMake(200,200);
    imageLayer.contents = (id)[UIImage imageNamed:@"lichen.jpg"].CGImage;
    imageLayer.contentsGravity = kCAGravityResizeAspect;
    [containView.layer addSublayer:imageLayer];

效果图

这里,要详细讲解以下contentGravity这个属性。这个属性决定了contents如何填充。

具体分为两个方面,

方面一,位置方面

具体如图

方面二,比例变换方面

如图

六 Layer于UIView的区别

摘自官方文档

Layers are not a replacement for your app’s views—that is, you cannot
create a visual interface based solely on layer objects. Layers provide
infrastructure for your views. Specifically, layers make it easier and
more efficient to draw and animate the contents
of views and maintain high frame rates while doing so. However, there
are many things that layers do not do. Layers do not handle events, draw
content, participate in the responder chain, or do many other things.
For this reason, every app must still have
one or more views to handle those kinds of interactions.

In iOS, every view is backed by a corresponding layer object but in
OS X you must decide which views should have layers. In OS X v10.8 and
later, it probably makes sense to add layers to all of your views.
However, you are not required to do so and can still
disable layers in cases where the overhead is unwarranted and unneeded.
Layers do increase your app’s memory overhead somewhat but their
benefits often outweigh the disadvantage, so it is always best to test
the performance of your app before disabling layer
support.

简单来说,View和Layer最大的区别就是View可以接受用户输入(例如触摸)而Layer不可以,Layer单独并不能呈现出任何可视的内容,必
须依托于View。Layer只是几何上呈现给用户的东西,它较为轻量,通常采用Cache技术,对资源消耗也较小。

转载:http://doc.okbase.net/Hello_Hwc/archive/123447.html

时间: 2024-08-19 13:35:20

CALayer及其子类的相关文章

iOS_核心动画CALayer(一)

目 录: 一.核心动画简介 二.图层与视图之间的关系 三.CALayer的使用说明 四.CALayer的隐式动画属性 五.在CALayer上绘图 六.总结 一.核心动画简介 Core Animation 是跨平台的,支持iOS环境和Mac OS X环境,而CALayer是核心动画的基础,可以帮助开发者做圆角.阴影.边框等效果.我们学习核心动画之前,需要先理解CALayer,因为核心动画操作的对象不是UIView,而是CALayer.对于UIView控件每个内部都有一个Layer的属性.我们在实现

iOS:CALayer核心动画层

CALayer:核心动画层 简介: Core Animation 是跨平台的,支持iOS环境和Mac OS X环境 学习核心动画之前,需要先理解CALayer,因为核心动画操作的对象不是UIView,而是CALayer CALayer是核心动画的基础,可以做圆角.阴影.边框等效果 每个UIView内部都有一个Layer的属性 在实现核心动画时,本质上是将CALayer中的内容转换成位图,从而便于图形硬件的操纵 UIView的CALayer基本演练: 演练设置UIView中的CALayer属性 –

iOS:CALayer核心动画层上绘图

在CALayer上绘图: •要在CALayer上绘图,有两种方法: 1.创建一个CALayer的子类,然后覆盖drawInContext:方法,可以使用Quartz2D API在其中进行绘图 2.设置CALayer的delegate,然后让delegate实现drawLayer:inContext:方法进行绘图 •注意: –不能再将UIView设置为这个CALayer的delegate,因为UIView对象已经是内部层的delegate,再次设置会出问题 –无论使用哪种方法,都必须向层发送set

OC - 21.CALayer核心要点及实例解析

CALayer基础 CALayer是每一个UI控件的核心,一个UI控件之所以能显示可以说是CALayer的功劳 每一个UI控件默认都为自己创建一个CALayer对象,通过drawRect方法将内容绘制在图层上,然后再显示出来 CALayer可以完成很多任务 调整UI控件的外观 执行动画 CALayer与UIView 二者可以达到相同的显示效果 UIView比CALayer多了用户交互功能 CALayer更加轻量级,性能更好 CALayer在系统架构中的位置 CALayer位于QuartzCore

CALayer一些知识~...3

CALayer回吐的先后顺序是怎样的呢?CALayer绘图时是先绘制父Layer的内容,然后绘制子Layer的内容,这样便可以让子Layer显示在父Layer上面 •要在CALayer上绘图,有两种方法: 1.创建一个CALayer的子类,然后覆盖drawInContext:方法,可以使用Quartz2D API在其中进行绘图 2.设置CALayer的delegate,然后让delegate实现drawLayer:inContext:方法进行绘图 •注意: –不能再将UIView设置为这个CAL

[iOS Animation]-CALayer 图层树 二

图层的能力 如果说CALayer是UIView内部实现细节,那我们为什么要全面地了解它呢?苹果当然为我们提供了优美简洁的UIView接口,那么我们是否就没必要直接去处理Core Animation的细节了呢? 某种意义上说的确是这样,对一些简单的需求来说,我们确实没必要处理CALayer,因为苹果已经通过UIView的高级API间接地使得动画变得很简单. 但是这种简单会不可避免地带来一些灵活上的缺陷.如果你略微想在底层做一些改变,或者使用一些苹果没有在UIView上实现的接口功能,这时除了介入C

[iOS Animation]-CALayer 专用图层

专用图层 复杂的组织都是专门化的 Catharine R. Stimpson 到目前为止,我们已经探讨过CALayer类了,同时我们也了解到了一些非常有用的绘图和动画功能.但是Core Animation图层不仅仅能作用于图片和颜色而已.本章就会学习其他的一些图层类,进一步扩展使用Core Animation绘图的能力. CAShapeLayer 在第四章『视觉效果』我们学习到了不使用图片的情况下用CGPath去构造任意形状的阴影.如果我们能用同样的方式创建相同形状的图层就好了. CAShape

[转载] iPhone/iOS Core Animation开发总结(CALayer)

目录[-] 一重要参数 二几何变形Transforming a Layers Geometry 三Layer数层结构Layer-Tree Hierarchy 四提供Layer内容Providing Layer Content 五动画 六CALayer的子类们 一.重要参数 bounds,frame,position属于基本的几何定位,相互之间数值变化会相互影响 anchorPoint:单位参数(0-1)表示,变形(transform)时候的变换源点 zPosition:相当于css中z-inde

[iOS Animation]-CALayer 图层树

图层的树状结构 巨妖有图层,洋葱也有图层,你有吗?我们都有图层 -- 史莱克 Core Animation其实是一个令人误解的命名.你可能认为它只是用来做动画的,但实际上它是从一个叫做Layer Kit这么一个不怎么和动画有关的名字演变而来,所以做动画这只是Core Animation特性的冰山一角. Core Animation是一个复合引擎,它的职责就是尽可能快地组合屏幕上不同的可视内容,这个内容是被分解成独立的图层,存储在一个叫做图层树的体系之中.于是这个树形成了UIKit以及在iOS应用