Core Animation 文档翻译 (第五篇)
前言
在APP中大多数情况下,将Layer和View对象结合使用是Layer最好的使用方式。然而,很多时候我们可能需要通过添加单独的Layer对象,以便增加视图继承层次;当为了提高性能,或为了实现View很难实现的特性,此时应该使用Layers,此时也需要知道如何管理我们创建Layer层次。
将Layers安插进Layer层次结构里
Layer层次结构在许多方面都和Views层次结构相似。我们将一个Layer嵌入到另外一个Layer里面,此时便在被用作嵌入的Layer(被称为sublayer)和父图层(superlayer)之间形成了父子关系;这种父子关系会对
sublayer的许多方面产生影响。例如,它的content处于它superlayer的上面,它的position也会相对于它的superlayer的坐标系统,它也会受到被应用到它的superlayer的transforms的影响。
添加、插入以及移除sublayers
每一个Layer对象都有用于添加、插入、移除子layer的方法。表4-1概括了这些方法和他们的功能。
Table 4-1 Methods for modifying the layer hierarchy
table th:first-of-type {
width: 15%;
}
table th:nth-of-type(2) {
width: 25%;
}
功能 | 方法 | 描述 |
---|---|---|
添加子layer | addsubLayer: | 为当前的layer添加一个新的sublayer对象,这个要被添加的sublayer会被添加到当前layer的sublayers数组的末尾。相对于sublayers数组中拥有相同zPosition属性值的layer,这个新的sublayer将会呈现在他们的顶部。 |
插入layer | insertSublayer:above: insertSublayer:atIndex: insertSublayer:below: | 以相对于另外的sublayer的position或者index将sublayer插入sublayer层结构。当要插入到另外的sublayer前面或者后面时候,我们只需要指定sublayer在数组中的位置。Layers对象是否可显示在屏幕上,第一取决于他们的zPosition属性,第二取决于他们在sublayer数组。 |
移除layers | removeFromSuperlayer | 从父layer中移除指定的sublayer |
交换layers的位置 | replaceSublayer:with: | 将两个sublayer的位置进行交换。如果我们要插入sublayer已经存在于其他的layer层次结构中了,那么这个sublayer将会先从之前的层次中移除 |
对于我们自己创建的Layer对象,可以使用上面的方法;我们不可以使用这些方法调整Layer-backed View 的Layer。但是一个Layer-backed View能够为我们单独创建的Layers当做父图层。
为Sublayers设置位置和尺寸
当添加和插入sublayer的时候,在sublayer显示到屏幕上之前,我们必须为sublayer设置size和position。我们也可以在将sublayer添加到图层上之后再修改size和position,但是我们最好将在创建Layer的时候就设置这两个值作为习惯。
使用bounds属性可以设置sublayer的尺寸,使用position属性可以
设置sublayer在它的superlayer内的位置。它的bounds的原点一直是(0,0),尺寸size就是我们设置的大小(以point为单位)。position属性适合layer的anchor point相关联的,anchor point默认是在layer的中心。如果我们不设置这些值,核心动画将会设置出事宽高为0,并设置position为(0,0)。
myLayer.bounds = CGRectMake(0, 0, 100, 100);
myLayer.position = CGPointMake(200, 200);
重要提示:确保layer的宽高为整数值。(一般我们使用的值都是以point位单位的而不是pixel,所以至少要保证在当前设备上的为分辨率的整数个数。)
Layer的层次是如何影响动画的
子layer的动画行为会受到superlayer的一些属性的影响。speed属性就是其中之一,他将会和动画的speed相乘,这个属性值默认被设置为1.0,若改为2.0将会引起动画以原来速度的2倍运行并以原来一半的时间结束,这个属性不仅仅影响它自身还影响它的sublayers。这个改变是可以逐层相乘的累积的。如果sublayer和super都被设置为2.0的speed,sublayer的动画将会以原速度的4倍运行。
许多layer的调整都会对他包含的sublayers产生相应的影响。例如,对layer使用旋转transform,则它所有的sublayer也会受到影响。相似的,改变一个layer的opacity属性也将会影响它的sublayers。layer尺寸的改变遵循布局规则(Adjusting the Layout of Your Layer Hierarchies.)
调整Layer层次的布局
为了响应superlayer的调整,核心动画为调整sublayer的size和position提供几个配置项。在iOS中layer-backed view的广泛使用是的layer层次的创建显得没那么重要;仅仅支持手动更新layout。对于OSX而言,有几个可用的配置能够使我们方便的管理layer层次。
Layer的层次layout仅当我们使用单独创建的Layer对象时才有意义。如果APP中所有的layer都是和view对应关联的,可以使用基于view的layout实现view响应的变化更新size和position。
Sublayers和剪裁
不像Views,一个superLayer不会自动裁剪超过它的bounds矩形区域的sublayers的content。superlayer允许它的sublayers默认完全不显示。然而,通过将属性maksToBunnds的值设为YES,可以启用裁剪操作。
Layer的圆角也被Layer的裁剪遮罩的形状包含在内。图4-3显示了masksToBounds属性是如何影响带有圆角的layer的。当masksToBounds属性被置为NO的时候,即使sublayer超出了superlayer的bounds,sublayer也会完整的展示。将masksToBounds属性改为YES将会引起他们sublayer的裁剪。
图4-3 根据superlayer的bounds裁剪sublayer
在两个Layers中进行坐标转换
有时,我们需要将一个Layer内的某个点坐标值转化为屏幕内其他layer内的坐标值。CALayer类提供了几个简单的转换方法:
除了转换点和矩形值之外,通过使用convertTime:fromLayer:和convertTime:toLayer:,我们还能在layers之间转换time值。每一个layer都有他们自己的time空间,并使用它的time空间来和系统参考系同步动画的开始和结束。这些time空间默认是同步的;但是,如果我们改变一些layer的speed,那么那些layer的time空间也将会相应的变化。我们可以使用时间转换方法获取这些因子,并确保两个layer的时间函数是同步的。
Core Animation 文档翻译 (第五篇)的更多相关文章
- Core Animation 文档翻译 (第一篇)
Core Animation 文档翻译(第一篇) 2018-01-13 星期6 前言:作为iOS 开发,官方文档的阅读是很有必要的,值此周末便写下此文.作为iOS 实际经验3年的开发,之前的应用 ...
- Core Animation文档翻译 (第一篇)
Core Animation 文档翻译(第一篇) 前言 作为iOS 开发,官方文档的阅读是很有必要的,值此周末便写下此文.作为iOS 实际经验3年的开发,之前有阅读并实践过经典的<iOS核心动画 ...
- Core Animation 文档翻译 (第二篇)
Core Animation 文档翻译 (第二篇) 核心动画基础要素 核心动画为我们APP内Views动画和其他可视化元素动画提供了综合性的实现体系.核心动画不是我们APP内Views的替代品,相反, ...
- Core Animation 文档翻译 (第六篇)
高级动画技巧 配置属性动画或者关键帧动画的方式是多种多样的.需要同时执行多个动画或者顺序执行多个动画的APP,可以通过高级的方式同步这些动画的timing或者将这些动画绑定在一起.我们也可以使用其 ...
- Core Animation 文档翻译(第三篇)
Core Animation 文档翻译(第三篇) 设置Layer对象 当我们使用核心动画时,Layer对象是一切的核心.Layers 管理我们APP的可视化content,Layer也提供了conte ...
- Core Animation 文档翻译 (第四篇)
Core Animation 文档翻译(第四篇) 让Layer的content动画起来 核心动画的基础接口以及为拥有Layer的View做的动画扩展接口,使得为Layer制作复杂动画变得简单化.例如改 ...
- Core Animation 文档翻译 (第八篇)—提高动画的性能
前言 核心动画是提高基于APP动画帧率的好方式,但是核心动画的使用不代表性能的提升的保证.尤其在OSX,当使用核心动画时,我们仍需选择最有效的方式.和所有的性能相关的问题一样,我们应该使用工具时时的评 ...
- Core Animation 文档翻译 (第七篇)——改变Layer的默认动画
前言 核心动画使用action对象实现它的可视化动画.一个action对象是指遵循CAAction协议并定义了Layer相关的动画行为的对象.所有的CAAnimation对象实现了这个协议,无论何时L ...
- ASP.NET Core 学习笔记 第五篇 ASP.NET Core 中的选项
前言 还记得上一篇文章中所说的配置吗?本篇文章算是上一篇的延续吧.在 .NET Core 中读取配置文件大多数会为配置选项绑定一个POCO(Plain Old CLR Object)对象,并通过依赖注 ...
随机推荐
- JavaScript基础知识(if、if else、else if、while、switch...case语句)
13.语句 概念:就是分号(:) 代表一条语句的结束 习惯:一行只编写一条语句:一行编写多条语句(代码可读性较差) 语句块:可以包含多条语句 "{ }"将多条语句包裹 u ...
- Spring框架学习笔记(10)——Spring中的事务管理
什么是事务 举例:A给B转500,两个动作,A的账户少500,B的账户多500 事务就是一系列的动作, 它们被当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不起作用 一.注解添加事务管理方 ...
- css实现视差滚动效果
今天逛京东金融的时候发现他家网站首页的滚动效果看着很有意思,于是就做了一个,demo链接http://1.liwenyang.applinzi.com/index.html 大多数的视差滚动效果都是使 ...
- TP5使用phpmailer实现邮件发送
1.从github下载PHPMailer,在vendor目录中新建文件夹phpmailer,将压缩包中的class.phpmailer.php和class.smtp.php复制到phpmailer中, ...
- phpstudy中的mysql
1.进入mysql命令台,执行 select version()即可 2status;
- 浅谈 C/S 和 B/S 架构
概述 在这个信息急剧膨胀的社会,我们不得不说人类正进入一个崭新的时代,那就是信息时代.信息时代的一个主要而显著的特征就是计算机网络的应用.计算机网络从最初的集中式计算,经过了Client/Server ...
- element-ui中upload组件如何传递文件及其他参数
最近项目用到了vuethink,里面集成了element-ui,之前一直用的是bootstrap框架,对js也是一知半解,然后也用过vue.js,但也是学的不通透的,然后就各种入坑. 下面就分析一下我 ...
- 虚拟主机导入MySQL出现Unknown character set: ‘utf8mb4’
http://www.lmlblog.com/14.html 前几天进行网站搬家,MySQL导入数据的时候,出现以下错误(没有定义的编码集utf8mb4): SQL 查询: ; MySQL 返回:文档 ...
- Intellij idea 导入 jdbc
第一步,去官网https://dev.mysql.com/downloads/connector/j/ 下载驱动程序 第二步,解压压缩包,记住路径 第三步,打开你的idea工程,打开Project S ...
- Redis单机版安装
1.工具简单介绍 1.博主使用的是Xshell工具 ps:需要设置端口和连接名称,端口一般默认为22,需要的童鞋可以自行百度 2.Redis单机版安装 第一步:安装gcc编译环境 yum instal ...