coreanimation文档翻译(第五篇)

周小闲 周小闲     2022-10-14     479

关键词:

 

前言


在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

功能 方法 描述
添加子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的时间函数是同步的。

第五篇vggnet——论文翻译

文章目录摘要1引言2ConvNet配置2.1架构2.2配置2.3讨论3分类框架3.1训练3.2测试3.3实现细节 查看详情

coreanimation文档翻译(第一篇)

CoreAnimation文档翻译(第一篇) 前言作为iOS开发,官方文档的阅读是很有必要的,值此周末便写下此文。作为iOS实际经验3年的开发,之前有阅读并实践过经典的<iOS核心动画高级技巧>,其gitbook地址,然总觉此书的翻译版,... 查看详情

coreanimation文档翻译(第一篇)

      CoreAnimation文档翻译(第一篇)    2018-01-13 星期6   前言:作为iOS开发,官方文档的阅读是很有必要的,值此周末便写下此文。作为iOS实际经验3年的开发,之前的应用之前有阅读并实践过经典的<i... 查看详情

coreanimation文档翻译(第四篇)

CoreAnimation文档翻译(第四篇)让Layer的content动画起来核心动画的基础接口以及为拥有Layer的View做的动画扩展接口,使得为Layer制作复杂动画变得简单化。例如改变Layer的frame的size、改变Layer在屏幕上的position、应用旋转transform、或... 查看详情

coreanimation文档翻译(第二篇)

CoreAnimation文档翻译(第二篇)  核心动画基础要素 核心动画为我们APP内Views动画和其他可视化元素动画提供了综合性的实现体系。核心动画不是我们APP内Views的替代品,相反,它是一种结合Views来提供更好性能和支持Co... 查看详情

coreanimation文档翻译(第六篇)

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

coreanimation文档翻译—附录c(kvc扩展)

前言?关于CAAnimation和CALayer类,核心动画扩展了NSKeyValueCoding协议。这个扩展为一些keys添加了默认值,扩大了封装协议,添加了为CGpoint、CGRect、CGSize和CATransform3D类型的支持。?KVC支持的集成类?CAAnimation和CALayer类是支持KVC的,这意... 查看详情

coreanimation文档翻译—附录b(可动画的属性)

前言?许多CALayer和CIFliter的属性都是可动画的。本节附录列出了这些属性默认使用的动画。?CALayer可动画属性?表B-1展示了CALayer类的可动画属性。针对每个属性此表也列出了对应的默认动画对象的类型,这些动画以隐式的方式执行... 查看详情

htmldom第五篇

通过HTMLDOM,JavaScript能够访问HTML文档中的每个元素。HTMLDOM允许您在事件发生时执行代码。当HTML元素"有事情发生"时,浏览器就会生成事件:在元素上点击加载页面改变输入字段添加、删除和替换HTML元素HTMLDOM允许JavaScript对HTML事... 查看详情

coreanimation文档翻译(第七篇)—改变layer的默认动画

前言核心动画使用action对象实现它的可视化动画。一个action对象是指遵循CAAction协议并定义了Layer相关的动画行为的对象。所有的CAAnimation对象实现了这个协议,无论何时Layer的属性发生变化的时候就会执行对应的action对象(包含C... 查看详情

coreanimation文档翻译(第八篇)—提高动画的性能

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

深入理解javascript作用域系列第五篇

...们就是一回事,只是高程和犀牛书关于作用域的两种不同翻译而已。但实际上,它们并不相同,却相互纠缠在一起。本文先用一张图开宗明义,然后进行术语的简单解释,最后根据图示内容进行详细说明 图示查看大图 概... 查看详情

第五篇:朴素贝叶斯分类算法原理分析与代码实现

...      朴素贝叶斯分类算法常常用于文档的分类,而且实践证明效果挺不错的。      在说明原理之前,先介绍一个叫 查看详情

第五篇:常用模块

第五篇:常用模块   PYTHON-模块time&datetime+目录规范PYTHON-模块-time&datetime-练习+目录规范PYTHON-模块sysosrandomshutilPYTHON-模块sysosrandomshutil-练习PYTHON-模块jsonpickleshelvexmlPYTHON-模块logginghashlibPY 查看详情

关于ajax第五篇

AJAX-服务器 响应如需获得来自服务器的响应,请使用XMLHttpRequest对象的responseText或responseXML属性。AJAX- onreadystatechange 事件当请求被发送到服务器时,我们需要执行一些基于响应的任务。每当readyState改变时,就会触发onr... 查看详情

spring第五篇

在Spring第四篇中我们主要介绍了setget的注入方式在Spring第五篇中我们主要介绍使用注解配置Spring主要分为两个步骤1导包的同时引入新得约束导包如下 1.1重写注解代理配置文件代码如下  <?xmlversion="1.0"encoding="UTF-8"?>... 查看详情

第五篇uber启动视频播放

importUIKitimportAVFoundationclassGuidePage:FxBasePage{@IBOutletvarbackImageView:UIImageView?varplayer:AVPlayer!varplayerItem:AVPlayerItem!varlocation:FxLocation!overrideinit(nibNamenibNameOrNil:Strin 查看详情

开始写游戏---第五篇

开始写游戏---第五篇  今天写了一个这个组件:        代码:          用的时候这么用:               这是组件的运行效果:      写是写好了。。。但是我发现,之前写... 查看详情