一 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

[objc] view plaincopy
  1. @property (weak, nonatomic) IBOutlet UIView *containView;

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

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

这样,运行后的效果如图

四 添加Sublayer

[objc] view plaincopy
  1. containView.layer.backgroundColor = [UIColor lightGrayColor].CGColor;
  2. containView.layer.cornerRadius = 20.0;
  3. containView.layer.shadowColor = [UIColor blueColor].CGColor;
  4. containView.layer.shadowOpacity = 0.8;
  5. containView.layer.shadowOffset = CGSizeMake(3.0, 3.0);
  6. containView.layer.borderColor = [UIColor redColor].CGColor;
  7. containView.layer.borderWidth = 2;
  8. CALayer * sublayer1 = [CALayer layer];
  9. sublayer1.backgroundColor = [UIColor blueColor].CGColor;
  10. sublayer1.frame = CGRectMake(0, 0,80,80);
  11. sublayer1.anchorPoint = CGPointMake(0.5, 0.5);
  12. sublayer1.position = CGPointMake(100,100);
  13. [containView.layer addSublayer:sublayer1];

效果图如图

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

[objc] view plaincopy
  1. sublayer1.position = CGPointMake(0,CGRectGetMaxY(containView.bounds)-10);

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

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

[objc] view plaincopy
  1. containView.layer.masksToBounds = YES;

效果如图

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

[objc] view plaincopy
  1. CAShapeLayer * shapeLayer = [CAShapeLayer layer];
  2. CGMutablePathRef path = CGPathCreateMutable();
  3. CGPathMoveToPoint(path,nil,0.0,0);
  4. CGPathAddLineToPoint(path,nil,0.0,CGRectGetHeight(containView.bounds)/2);
  5. shapeLayer.path = path;
  6. shapeLayer.bounds = CGRectMake(0,0,5.0,CGRectGetHeight(containView.bounds)/2);
  7. shapeLayer.anchorPoint = CGPointMake(0.5, 0.5);
  8. shapeLayer.position = CGPointMake(CGRectGetMidX(containView.bounds),CGRectGetMidY(containView.bounds));
  9. shapeLayer.lineWidth = 5.0;
  10. shapeLayer.lineCap = kCALineCapRound;
  11. shapeLayer.strokeColor = [UIColor yellowColor].CGColor;
  12. [containView.layer addSublayer:shapeLayer];
  13. CATextLayer * textLayer = [CATextLayer layer];
  14. NSString * text = @"blog.csdn.net/hello_hwc";
  15. NSAttributedString * attributeString = [[NSAttributedString alloc] initWithString:text];
  16. textLayer.string = text;
  17. textLayer.alignmentMode = @"center";
  18. textLayer.fontSize = 12;
  19. textLayer.foregroundColor = [UIColor brownColor].CGColor;
  20. CGRect bounds;
  21. bounds.origin = CGPointMake(0, 0);
  22. bounds.size = attributeString.size;
  23. textLayer.bounds = bounds;
  24. textLayer.position = CGPointMake(100,100);
  25. [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显示图片

[objc] view plaincopy
  1. CALayer * imageLayer = [CALayer layer];
  2. imageLayer.bounds = CGRectMake(0,0,200,100);
  3. imageLayer.position = CGPointMake(200,200);
  4. imageLayer.contents = (id)[UIImage imageNamed:@"lichen.jpg"].CGImage;
  5. imageLayer.contentsGravity = kCAGravityResizeAspect;
  6. [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技术,对资源消耗也较小。

七 接下来的计划

下一篇会继续更新CALayer,更新一些不常用的属性和方法,然后更新Core Animation的内容

CALayer( 一 )相关推荐

  1. 【动画2】CALayer动画

    一)UIView动画 二)CoreAnimation动画 前言:上一篇已经介绍了UIKit给我们封装好的UIView动画的使用,UIKit动画是建立在CoreAnimation动画之上的,CoreAn ...

  2. 多个CALayer的联动

    在如何通过手势捕获CALayer基础上做了个示例,两个CALayer的联动,当拖动左侧的Layer的时候,右侧的Layer随动.因为右侧的动画没有关闭,有延迟,产生随动的效果.如果不想延迟,可参考拖动 ...

  3. iOS:CALayer核心动画层

    CALayer:核心动画层 简介: Core Animation 是跨平台的,支持iOS环境和Mac OS X环境 学习核心动画之前,需要先理解CALayer,因为核心动画操作的对象不是UIView, ...

  4. [分享]iOS开发-UI篇:CAlayer层的属性

    iOS开发UI篇-CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property ...

  5. iOS 动画之CoreAnimation(CALayer)

    CoreAnimation基本介绍 CoreAnimation动画位于iOS框架的Media层 CoreAnimation动画实现需要添加QuartzCore.Framework CoreAnimat ...

  6. CALayer(二)

    前言:本文涵盖了(1)绘制CALayer的三种方式(2)Layer Tree 一 提供CALayer内容的三种方式 把一个图像对象直接赋值给contents属性(这是提供CALayer内容的最好方式) ...

  7. IOS开发CALayer隐式动画

    2019独角兽企业重金招聘Python工程师标准>>> 每一个自定义的layer都存在默认的隐私动画,隐式动画默认为1/4秒 @interface DYViewController ...

  8. 从 CALayer 的 Position、AnchorPoint 说起

    本文 demo 地址 有的东西虽然基础,但是耐不住人老记性差呀,自己写下来好过次次再搜咯,so...... AnchorPoint 和 Position AnchorPoint anchorPoint ...

  9. 小知识六、CALayer动画

    CAShapeLayer 圆形指示器 let ovalShapeLayer: CAShapeLayer = CAShapeLayer()let anotherOvalShapeLayer: CASha ...

最新文章

  1. Vivado开发过程中生成的主要文件
  2. 前端学习(1153):常量const01
  3. 帆软单点登录_电子表格FineReport教程:[20]CAS单点登录
  4. Java 修改文件最后的创建日期
  5. Android 的一点总结
  6. Python中布尔值是False的所有值
  7. python socket多线程并发_【Python之旅】第五篇(三):Python Socket多线程并发
  8. Python按位异或运算符^应用案例一则:查找只出现一次的数字
  9. 若依前后端分离前端使用Vue3启动教程
  10. 硬盘安装Debian
  11. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第1节 基本概念_02maven依赖管理的概念
  12. 蓝桥杯刷题 -- 第六届蓝桥杯
  13. bootstrap 检验 法 原理_三种中介效应检验方法及操作步骤 - spssau
  14. CentOS 安装Oracle 11g R2
  15. 查看pcie总线上的设备ID以及带宽计算
  16. 20145326蔡馨熤《信息安全系统设计基础》期末总结
  17. 什么是MapReduce?MapReduce整体架构搭建使用介绍
  18. 微软又发布了一款命令行神器,功能太强了!
  19. Win10安装S32DS_ARM_V2018.R1
  20. 芯片制造和芯片技术研发同时突破,中国芯片开创新道路

热门文章

  1. Gut:卡姆果提取物改变肠道菌群预防小鼠肥胖
  2. oracle分区表执行计划分区合并,利用ORACLE分区技术提高管理和性能_PART2
  3. react 嵌套渲染_React 中嵌套数组数据如何渲染到前端页面
  4. python使用pandas计算dataframe中每个分组的极差、分组数据的极差(range)、使用groupby函数和agg函数计算分组的最大值和最小值
  5. Python使用matplotlib进行3D可视化分析:3d柱状图、3d直方图、3d线框图、3d曲面图、3d翼面图(莫比乌斯环)
  6. pandas计算dataframe数据行的均值(mean)实战:设置skipna=False则计算行均值时不会忽略NaN值
  7. R语言sub函数和gsub函数替换(replace)匹配的字符串实战
  8. permutation_importance是什么?背后的思想又是什么?是如何使用permutation_importance计算特征重要度的?
  9. cutadapt 处理fastq文件
  10. 使用rar备份mysql_用RAR备份源代码_用WSH备份数据库