学习资源来自:图层树Quartz 2D

Core Animation 复合引擎,职责为尽可能快地组合屏幕上不同的可视内容。这些内容被分解成多个独立的图层,存储在 图层树 的体系中。于是这个树形成了 UIKit框架 和屏幕上所能看到的一切基础。

------


1. 图层树

1.1. 图层与视图

参考:图层与视图

视图由 UIView 派生的,可以处理触摸事件,支持 CoreGraphics 绘图,Affine Transformation,或者 UIView animation 简单动画。
图层有 CALayer 管理的。

  1. 视图层 - UIView
  2. 图层树 - CALayer
  3. 呈现树
  4. 渲染树

1.2. 图层的能力

参考:图层的能力

为何使用图层(CALayer)呢,因为做一些 UIView 不能做的事情:

  • 阴影,圆角,颜色边框
  • 3D 变换
  • 非矩阵范围
  • 透明遮罩
  • 多级非线性动画

1.3. 使用图层

参考:使用图层

为啥要选择使用图层(CALayer)?

  • 要使用特殊图层
  • 要求性能(例如:内存占用)特别挑剔,如果你想更高要求,你可能考虑OpenGL绘图。

1.4 图层树总结

iOS 屏幕中 UIView 的视图层级关系形成了一种平行的 CAlayer 图层关系。

------


2. 寄宿图(CALayer 的 contexts 属性)

2.1 contents属性

contents属性
Toll-Free Bridging

CALayer 又一个属性叫做:contents,这个属性类型定义为 id,意味着它可以接受任何类型的对象。这种情况下,你可以赋任何值,app 都会编译通过。但在实践中,如果 contents 不赋值 CGImage 类型,得到的图层将会是空白的。

为什么contents 有这样问题,因为CALayer 想兼容 iOS 和 OS X 系统的 CGImage 和 NSImage 类型。但事实上,给 contents 真正赋值的类型应该是 CGImageRef (CGImage 结构指针)。如果你赋值使用的是UIImage.CGImage ,将会得到系统提示的编译错误,因为UIImage的CGImage 属性返回的是 CGImageRef 类型,这个是Core Foundation 类型,不是 Coco 对象。所以要通过Toll-Free Bridging转化。

layer.contents = (__bridge id)image.CGImage;

2.2 contentsGravity属性

CALayer 的 contentGravity 属性相同与 UIView 的 contentMode

2.3 contentsScale属性

这个属性定义 contents 的像素尺寸和视图大小的比例。意义在于绘制的时候是按照每一点 contentsScale 个像素进行绘制,这就是Retain的意义。
因为在设置 ContentsGravity 拉伸时候,CALayer 不会自动读取设备屏幕的最大分辨率,所以会导致图像显示有锯齿,通过这样设置:
layer.contentsScale = [UIScreen mainScreen].scale;

2.4 maskToBounds属性

CALayer.maskToBounds 属性相当于 UIView.clipsToBounds 属性。对超过图层边界的内容进行裁剪。

2.5 contentsRect属性

CALayer 的 contentsRect 属性允许我们在图层边框里面显示 contents 的一个子域。这涉及到图片是如何显示和拉伸的,要比 contentsGravity 灵活多了。

contentsRect 使用单位坐标,单位坐标指定在 0 到 1 之间,是一个相对值(像素和点就是绝对值)。
单位坐标 —— 对于图片大小或是图层边界相关的显示,单位坐标是一个方便的度量单位
下图,一个自定义的的 contentsRect(左)和之前显示的内容(右)。

contentsRect 可以用来做图片拼合(image sprites ),例如app:拍立得,美图秀秀等。
contentsRect 还可以用来做打包整合图片,这样图片使用就可以一次载入很多icon,节省内存,渲染性能。例如下图:

在app中载入上图这张拼合图,然后把它分给四个CALayer 的 contents 中,然后设置每个图层的 contentsRect 裁去不想显示的部分。

2.6 contentsCenter属性

CALayer 的 contentsCenter 工作效果和 UIImage 的 resizeableImageWithWithCapInsets: 对图层进行拉伸(Stretching)。

CALayer 的 contentsCenter 单位也是使用 单位坐标。不过是相当于 CGRect 的{0,0,1,1}格式。在寄宿图 contentsCenter 中描述使用的作用很详细。

2.7. Custom Drawing

我们可以通过继承 UIView 并实现 -drawRect: 方法来自定义绘制(Custom Drawing)。

当继承自 UIView 的类检测到 -drawRect: 方法被重写时,就会创建一个 contents ,大小等于这个类视图的大小乘以分辨率(contentsScale)。这也就是为什么重写 -drawRect: 为什么会导致CPU资源和内存的浪费。可以看我的另一篇博文 drawRect导致内存增加

------


3. 图层几何学

【CoreAnimation】1 到 5的更多相关文章

  1. iOS CoreAnimation详解(一) 有关Layer的动画

    以前由于项目需要 也写了一些动画 ,但是知识不系统,很散.这段时间趁着项目完成的空袭,来跟着大神的脚步系统的总结一下iOS中Core Animation的知识点. 原博客地址:http://blog. ...

  2. CoreAnimation 之CATextLayer

    如果你想在一个图层中显示文字,完全可以借助图层代理直接将Core Graphics写入图层的内容(这就是UILabel的精髓).如果雨果寄宿于图层的视图,直接在图层上操作,其实相当繁琐.你要为每一个显 ...

  3. 二、CoreAnimation之寄宿图详解

    在之前的图层树中我们知道,可以使用CALayer对象创建一些有背景颜色的图层,其实使用CALayer,不仅可以利用其展示背景颜色,还可以展示图片.而这些展示内容,其实就是CALayer的寄宿图.这一节 ...

  4. 一、CoreAnimation之图层树详解

    CoreAnimation :在字面意思为“核心动画”,但是如果您认为它仅仅是一个动画框架,那可能就要错过一些经典功能了.动画,只是CoreAnimation功能的一小部分,毕竟人家的源头是一个叫做L ...

  5. iOS CoreAnimation 核心动画

    一 介绍 一组非常强大的动画处理API 直接作用在CALAyer上,并非UIView(UIView动画) CoreAnimation是所有动画的父类,但是不能直接使用,应该使用其子类 属性: dura ...

  6. ios基础篇(二十五)—— Animation动画(UIView、CoreAnimation)

    Animation主要分为两类: 1.UIView属性动画 2.CoreAnimation动画 一.UIView属性动画 UIKit直接将动画集成到UIView类中,实现简单动画的创建过程.UIVie ...

  7. iOS关于CoreAnimation动画知识总结

    一:UIKit动画 在介绍CoreAnimation动画前先简单介绍一下UIKit动画,大部分简单的动画都可以使用UIKit动画实现,如果想实现更复杂的效果,则需要使用Core Animation了: ...

  8. CoreAnimation方法汇总

    使用CoreAnimation一般分为三个部分:1.创建执行动画的CALayer 2.创建动画 3.CALayer 添加Animation CoreAnimation是以锚点为基础. CoreAnim ...

  9. CoreAnimation笔记

    核心动画继承结构 CoreAnimation Core Animation是直接作用在CALayer上的(并非UIView上)非常强大的跨Mac OS X和iOS平台的动画处理API,Core Ani ...

  10. iOS开发之 动画CoreAnimation

    http://blog.treney.com/index.php/archives/CoreAnimation.html?hmsr=toutiao.io&utm_medium=toutiao. ...

随机推荐

  1. win10家庭版查看已连接wifi密码

    点击屏幕右下角无线网路图标. 点击网络设置. 完成.

  2. iOS获取网络图片大小

    在iOS开发过程中经常需要通过网络请求加载图片,有时,需要在创建UIImageView或UIButton来显示图片之前需要提前知道图片的尺寸,根据图片尺寸创建对应大小的控件.但是对于网络图片来说,要想 ...

  3. 教你怎么半天搞定Docker

    首先,不要把docker想的那么高大,它不就是先做个镜像,然后通过docker像虚拟机一样跑起来嘛...docker其实在真实业务场景中还是非常有局限性的.Dockerfile脚本也没那么好写,有些应 ...

  4. JSON金额解析BUG的解决过程

    [原创申明:文章为原创,欢迎非盈利性转载,但转载必须注明来源] 这是在我们开发的一个支付系统中暴露的一个BUG,问题本身比较简单,有意思的是解决问题的过程.将过程分享出来,希望能够对大家有所帮助. 一 ...

  5. 突然想到一个问题:有关 cqrs 分离

    大部分的系统,都是查询多,c少,那为什么我们不把q放在内存里面,而c直接操作数据库呢? 就如enode,c在内存,而q在数据库,当然q也很容易扩展到内存缓存上.二个enode案例demo,都可以让c的 ...

  6. Eclipse中JAR System library 没有怎么添加?

    1.打开  >>  Eclipse 2.右击项目   >>  Build path  >>  Configure Build path  如图1: 图1 3.进入 ...

  7. Oracle汉字转拼音package

    --函数GetHzFullPY(string)用于获取汉字字符串的拼音 --select GetHzFullPY('中华人民共和国') from dual; --返回:ZhongHuaRenMinGo ...

  8. 在tmux中的vi 上下左右键变为了ABCD等字符

    在本机上用vim编辑时,上下左右键没有问题,但是在tmux中确出现ABCD等字符. 原因是在tmux这个终端,默认做了字符转换,网上搜了很多答案,解决问题的设置是: set term=xterm

  9. zabbix-3.0.3 mysql表分区的方法

    目的:解决mysql空间越来越大,mysql性能出现瓶颈,zabbix会无端出现大量agent超时报警 中间遇到一个mysql问题:5.1版本的mysql不支持分表(其实是支持的,需要重新编译mysq ...

  10. PL/SQL配置Oracle数据库路径

    打开PL/SQL-Tools->Preferences-Orcacle->Connecttion 找到配置路径,打开-product\instantclient_11_2\NETWORK\ ...