【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. ...
随机推荐
- JavaScript学习笔记5 之 计时器 & scroll、offset、client系列属性 & 图片无缝滚动
一.计时器 setInterval ( 函数/名称 , 毫秒数 )表示每经过一定的毫秒后,执行一次相应的函数(重复) setTimeout ( 函数/名称 , 毫秒数 ) 表示经过一定的毫秒后,只执行 ...
- iOS 自定义方法 - UIView扩展
示例代码 //#import <UIKit/UIKit.h>@interface UIView (LPCView)/** 上 */@property CGFloat top;/** 下 * ...
- Angularjs-项目搭建
开发工具采用WebStorm,没破解,使用了过期策略:安装之后不着急打开程序,先设置系统日期为未来的某个日期,比如2020年.然后再打开程序,试用.然后再改回来系统日期.虽然每次打开WebStorm都 ...
- Appfuse:记录操作日志
appfuse的数据维护操作都发生在***form页面,与之对应的是***FormController,在Controller中处理数据的操作是onSubmit方法,既然所有的操作都通过onSubmi ...
- 完全删除TFS2013上的项目
必备条件:您必须是 Team Foundation Server Administrators 组的成员或待删除项目的 Project Administrators 组的成员. 解决方法:打开&quo ...
- C# 中Switch case 返回不止用break
Switch(temp) { case "A": //跳出循环 break; case "B": //返回值 return var; case "C& ...
- memcached安装配置+基础操作
先安装依赖关系 下载libevent-2.0.21-stable.tar.gz wget https://github.com/downloads/libevent/libevent/libevent ...
- [python]set集合学习
python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和 ...
- spring3系列一
IOC基础 Ioc是什么 Ioc--Inversion of Control 控制反转,不是什么技术,而是一种设计思想.在java开发中,ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对 ...
- Life
24小时热水.24小时无线WiFi.24小时空调:有人陪你,不孤单,不寂寞,不瞎想,不停的传播正能量