【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. ...
随机推荐
- iOS 汉字的拼音
获取汉字的拼音 #import <Foundation/Foundation.h> @interface NSString (Utils) /** * 汉字的拼音 * * @return ...
- Xamarin Android Activity全屏的两种方式
方式一 直接在Activity的Attribute中定义 如下 在 MainActivity 中 [Activity(Label = "app", MainLauncher = t ...
- iOS加密方式及解压缩文件
Base64加密方式 Base64是一种加密方法,可逆的加密. Base64中的可打印字符包括字母A-Z.a-z.数字0-9,这样共有62个字符./ + 填充 = echo -n BC|base64 ...
- 20-C语言结束
我回去看了下5号写的.虽然今天已经21号了~,花了16天. 复习完C专题,接下来我大概会用C做一些操作系统/信息安全的小东西,会发到博客里,敬请期待! ----2016/11/21
- java中IO流异常处理
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- Spring下如何配置bean
本次讲述项目背景: 创建Service类,Service下用到dao类.通过在Spring中配置bean,实现在项目启动时,自动加载这个类 本次只讲述配置bean的注意事项,故只给出简单实例: 创建S ...
- [Erlang 0127] Term sharing in Erlang/OTP 上篇
之前,在 [Erlang 0126] 我们读过的Erlang论文 提到过下面这篇论文: On Preserving Term Sharing in the Erlang Virtual Machine ...
- Mysql常用函数,难点,注意
一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整数值 EXP(x) 返回值e( ...
- python处理json和redis hash的坑
1.使用MySQLdb读取出来的数据是unicode字符串,如果要写入redis的hash中会变成 "{u'eth0_outFlow': 2.5, u'eth1_inFlow': 3.44} ...
- 光盘 iso 镜像制作相关命令操作
1. 安装制作工具 mkisofs yum install mkisofs -y 2. Linux 操作系统镜像 iso 打包 mkisofs -o /root/.iso \ -V mini7 -b ...