【CoreAnimation】1 到 5
Core Animation 复合引擎,职责为尽可能快地组合屏幕上不同的可视内容。这些内容被分解成多个独立的图层,存储在 图层树 的体系中。于是这个树形成了 UIKit框架 和屏幕上所能看到的一切基础。
------
1. 图层树
1.1. 图层与视图
参考:图层与视图
视图由 UIView 派生的,可以处理触摸事件,支持 CoreGraphics 绘图,Affine Transformation,或者 UIView animation 简单动画。
图层有 CALayer 管理的。
- 视图层 - UIView
- 图层树 - CALayer
- 呈现树
- 渲染树
1.2. 图层的能力
参考:图层的能力
为何使用图层(CALayer)呢,因为做一些 UIView 不能做的事情:
- 阴影,圆角,颜色边框
- 3D 变换
- 非矩阵范围
- 透明遮罩
- 多级非线性动画
1.3. 使用图层
参考:使用图层
为啥要选择使用图层(CALayer)?
- 要使用特殊图层
- 要求性能(例如:内存占用)特别挑剔,如果你想更高要求,你可能考虑OpenGL绘图。
1.4 图层树总结
iOS 屏幕中 UIView 的视图层级关系形成了一种平行的 CAlayer 图层关系。
------
2. 寄宿图(CALayer 的 contexts 属性)
2.1 contents属性
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的更多相关文章
- iOS CoreAnimation详解(一) 有关Layer的动画
以前由于项目需要 也写了一些动画 ,但是知识不系统,很散.这段时间趁着项目完成的空袭,来跟着大神的脚步系统的总结一下iOS中Core Animation的知识点. 原博客地址:http://blog. ...
- CoreAnimation 之CATextLayer
如果你想在一个图层中显示文字,完全可以借助图层代理直接将Core Graphics写入图层的内容(这就是UILabel的精髓).如果雨果寄宿于图层的视图,直接在图层上操作,其实相当繁琐.你要为每一个显 ...
- 二、CoreAnimation之寄宿图详解
在之前的图层树中我们知道,可以使用CALayer对象创建一些有背景颜色的图层,其实使用CALayer,不仅可以利用其展示背景颜色,还可以展示图片.而这些展示内容,其实就是CALayer的寄宿图.这一节 ...
- 一、CoreAnimation之图层树详解
CoreAnimation :在字面意思为“核心动画”,但是如果您认为它仅仅是一个动画框架,那可能就要错过一些经典功能了.动画,只是CoreAnimation功能的一小部分,毕竟人家的源头是一个叫做L ...
- iOS CoreAnimation 核心动画
一 介绍 一组非常强大的动画处理API 直接作用在CALAyer上,并非UIView(UIView动画) CoreAnimation是所有动画的父类,但是不能直接使用,应该使用其子类 属性: dura ...
- ios基础篇(二十五)—— Animation动画(UIView、CoreAnimation)
Animation主要分为两类: 1.UIView属性动画 2.CoreAnimation动画 一.UIView属性动画 UIKit直接将动画集成到UIView类中,实现简单动画的创建过程.UIVie ...
- iOS关于CoreAnimation动画知识总结
一:UIKit动画 在介绍CoreAnimation动画前先简单介绍一下UIKit动画,大部分简单的动画都可以使用UIKit动画实现,如果想实现更复杂的效果,则需要使用Core Animation了: ...
- CoreAnimation方法汇总
使用CoreAnimation一般分为三个部分:1.创建执行动画的CALayer 2.创建动画 3.CALayer 添加Animation CoreAnimation是以锚点为基础. CoreAnim ...
- CoreAnimation笔记
核心动画继承结构 CoreAnimation Core Animation是直接作用在CALayer上的(并非UIView上)非常强大的跨Mac OS X和iOS平台的动画处理API,Core Ani ...
- iOS开发之 动画CoreAnimation
http://blog.treney.com/index.php/archives/CoreAnimation.html?hmsr=toutiao.io&utm_medium=toutiao. ...
随机推荐
- win10家庭版查看已连接wifi密码
点击屏幕右下角无线网路图标. 点击网络设置. 完成.
- iOS获取网络图片大小
在iOS开发过程中经常需要通过网络请求加载图片,有时,需要在创建UIImageView或UIButton来显示图片之前需要提前知道图片的尺寸,根据图片尺寸创建对应大小的控件.但是对于网络图片来说,要想 ...
- 教你怎么半天搞定Docker
首先,不要把docker想的那么高大,它不就是先做个镜像,然后通过docker像虚拟机一样跑起来嘛...docker其实在真实业务场景中还是非常有局限性的.Dockerfile脚本也没那么好写,有些应 ...
- JSON金额解析BUG的解决过程
[原创申明:文章为原创,欢迎非盈利性转载,但转载必须注明来源] 这是在我们开发的一个支付系统中暴露的一个BUG,问题本身比较简单,有意思的是解决问题的过程.将过程分享出来,希望能够对大家有所帮助. 一 ...
- 突然想到一个问题:有关 cqrs 分离
大部分的系统,都是查询多,c少,那为什么我们不把q放在内存里面,而c直接操作数据库呢? 就如enode,c在内存,而q在数据库,当然q也很容易扩展到内存缓存上.二个enode案例demo,都可以让c的 ...
- Eclipse中JAR System library 没有怎么添加?
1.打开 >> Eclipse 2.右击项目 >> Build path >> Configure Build path 如图1: 图1 3.进入 ...
- Oracle汉字转拼音package
--函数GetHzFullPY(string)用于获取汉字字符串的拼音 --select GetHzFullPY('中华人民共和国') from dual; --返回:ZhongHuaRenMinGo ...
- 在tmux中的vi 上下左右键变为了ABCD等字符
在本机上用vim编辑时,上下左右键没有问题,但是在tmux中确出现ABCD等字符. 原因是在tmux这个终端,默认做了字符转换,网上搜了很多答案,解决问题的设置是: set term=xterm
- zabbix-3.0.3 mysql表分区的方法
目的:解决mysql空间越来越大,mysql性能出现瓶颈,zabbix会无端出现大量agent超时报警 中间遇到一个mysql问题:5.1版本的mysql不支持分表(其实是支持的,需要重新编译mysq ...
- PL/SQL配置Oracle数据库路径
打开PL/SQL-Tools->Preferences-Orcacle->Connecttion 找到配置路径,打开-product\instantclient_11_2\NETWORK\ ...