学习资源来自:图层树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. KOTLIN开发语言文档(官方文档) -- 入门

    网页链接:https://kotlinlang.org/docs/reference/basic-syntax.html 1.   入门 1.1.  基本语法 1.1.1.   定义包 包说明应该在源 ...

  2. MAC的SVN怎么设置允许.a文件上传

    首先在mac中svn的安装会去选择Cornerstone 如果遇到这个问题肯定是已经安装并准备上传.a 文件了.首先要清楚svn是默认过滤忽略.a文件的上传的,要想可以上传.a 可以通过这个简单的方法 ...

  3. 30分钟让网站支持HTTPS

    对于一个良好和安全的网络——并且也为了更快的性能,新的API网络例如Service Workers,更佳的搜索排名,还有——在你的网站上使用HTTPS是关键.这里我会指导大家如何轻松搞定. 我不是安全 ...

  4. java 中抽象类和接口的五点区别?

    1.一个类可以实现多个接口 ,但却只能继承最多一个抽象类. 2.抽象类可以包含具体的方法 , 接口的所有方法都是抽象的. 3.抽象类可以声明和使用字段 ,接口则不能,但接口可以创建静态的final常量 ...

  5. ViewPager之Fragment页面切换

    一.概述 ViewPager是android-support-v4中提供的类,它是一个容器类,常用于页面之间的切换. 继上篇文章<ViewPager之引导页>之后,本文主要介绍ViewPa ...

  6. 关于case语句中声明变量并初始化的注意事项

    今天看到一句对这个问题特别精辟的总结,记录如下: It is possible to transfer into a block, but not in a way that bypasses dec ...

  7. The user specified as a definer ('root'@'%') does not exist 异常解决

    参考:http://www.cnblogs.com/Magicam/archive/2013/07/22/3207382.html 权限问题,授权 给 root  所有sql 权限 mysql> ...

  8. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  9. 版本控制-Git服务器搭建和常用命令使用

    Git是目前世界上最先进的分布式版本控制系统(没有之一).使用Svn的请参考<版本控制-svn服务器搭建和常用命令(centos 6.3)>,下面介绍Git的常用命令 常用命令 简单版 升 ...

  10. Double Dispatch讲解与实例-面试题

    引言 说实话,我看过GoF<Design Patterns>,也曾深深的被李建忠<设计模式>系列Webcast吸引.但是还没有见过“Double Dispatch模式”.的确G ...