前言


在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 文档翻译 (第五篇)的更多相关文章

  1. Core Animation 文档翻译 (第一篇)

    Core Animation 文档翻译(第一篇)   2018-01-13  星期6 前言:作为iOS 开发,官方文档的阅读是很有必要的,值此周末便写下此文.作为iOS 实际经验3年的开发,之前的应用 ...

  2. Core Animation文档翻译 (第一篇)

    Core Animation 文档翻译(第一篇) 前言 作为iOS 开发,官方文档的阅读是很有必要的,值此周末便写下此文.作为iOS 实际经验3年的开发,之前有阅读并实践过经典的<iOS核心动画 ...

  3. Core Animation 文档翻译 (第二篇)

    Core Animation 文档翻译 (第二篇) 核心动画基础要素 核心动画为我们APP内Views动画和其他可视化元素动画提供了综合性的实现体系.核心动画不是我们APP内Views的替代品,相反, ...

  4. Core Animation 文档翻译 (第六篇)

      高级动画技巧 配置属性动画或者关键帧动画的方式是多种多样的.需要同时执行多个动画或者顺序执行多个动画的APP,可以通过高级的方式同步这些动画的timing或者将这些动画绑定在一起.我们也可以使用其 ...

  5. Core Animation 文档翻译(第三篇)

    Core Animation 文档翻译(第三篇) 设置Layer对象 当我们使用核心动画时,Layer对象是一切的核心.Layers 管理我们APP的可视化content,Layer也提供了conte ...

  6. Core Animation 文档翻译 (第四篇)

    Core Animation 文档翻译(第四篇) 让Layer的content动画起来 核心动画的基础接口以及为拥有Layer的View做的动画扩展接口,使得为Layer制作复杂动画变得简单化.例如改 ...

  7. Core Animation 文档翻译 (第八篇)—提高动画的性能

    前言 核心动画是提高基于APP动画帧率的好方式,但是核心动画的使用不代表性能的提升的保证.尤其在OSX,当使用核心动画时,我们仍需选择最有效的方式.和所有的性能相关的问题一样,我们应该使用工具时时的评 ...

  8. Core Animation 文档翻译 (第七篇)——改变Layer的默认动画

    前言 核心动画使用action对象实现它的可视化动画.一个action对象是指遵循CAAction协议并定义了Layer相关的动画行为的对象.所有的CAAnimation对象实现了这个协议,无论何时L ...

  9. ASP.NET Core 学习笔记 第五篇 ASP.NET Core 中的选项

    前言 还记得上一篇文章中所说的配置吗?本篇文章算是上一篇的延续吧.在 .NET Core 中读取配置文件大多数会为配置选项绑定一个POCO(Plain Old CLR Object)对象,并通过依赖注 ...

随机推荐

  1. CCNA笔记(1)

    一个最简单的图来了解网络结构 一个路由器经过数据传输,目标pc的网卡网线接受数据,使数据能交换,然后就连上了互联网

  2. POJ 3154 Graveyard【多解,数论,贪心】

    Graveyard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1707   Accepted: 860   Specia ...

  3. 数值积分之Simpson公式与梯形公式

    Simpson(辛普森)公式和梯形公式是求数值积分中很重要的两个公式,可以帮助我们使用计算机求解数值积分,而在使用过程中也有多种方式,比如复合公式和变步长公式.这里分别给出其简单实现(C++版): 1 ...

  4. textarea自适应高度,div模仿textarea可编辑实现自适应高度,placeholder使用图标

    1.textarea自适应高度,placeholder使用图标 自适应高度,有很多种办法: 1)jq: $("textarea").on("input",fun ...

  5. 算法--链表的K逆序问题

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/9e6f4dda3138cf9fab17f996ec85b624.html 链表的K逆序问题     链表的k逆 ...

  6. Java-String.intern的深入研究

    When---什么时候需要了解String的intern方法: 面试的时候(蜜汁尴尬)!虽然不想承认,不过面试的时候经常碰到这种高逼格的问题来考察我们是否真正理解了String的不可变性.String ...

  7. phpstudy php5.4以上版本伪静态设置 thinkphp

    http://www.thinkphp.cn/topic/35958.html <IfModule mod_rewrite.c> Options +FollowSymlinks -Mult ...

  8. 关于HTTP请求出现 405状态码 not allowed的解决办法

    最近学爬虫.发现httppost请求目标网站会出现405 状态码,原因为 Apache.IIS.Nginx等绝大多数web服务器,都不允许静态文件响应POST请求 所以将post请求改为get请求即可

  9. SMTP错误码建议解决方法

    https://wenku.baidu.com/view/0af30e01e87101f69e3195b8.html SMTP 错误码 / 建议解决方法 错误总表 101 Cannot Open Co ...

  10. // 关闭调试模式  define('APP_DEBUG', false);

    调试模式的优势在于: 开启日志记录,任何错误信息和调试信息都会详细记录,便于调试: 关闭模板缓存,模板修改可以即时生效: 记录SQL日志,方便分析SQL: 关闭字段缓存,数据表字段修改不受缓存影响: ...