CoreAnimation编程指南(四)图层树结构

图层不但给自己提供可视化的内容和管理动画,而且充当了其他图层的容器类,构建图层层次结构。 
本章介绍了图层层次结构,以及如何操纵该图层层次结构。
 
一、什么是图层树的层次结构

1.图层树是核心动画里面类似Cocoa视图的层次结构。比如一个NSView或者UIView的实例拥有父视图(superview)和子视图(subview),一个核心动画的图层拥有父图层(suplayer)和子图层(sublayer)。图层树和视图结构一样提供了很多便利:
(1)复杂的接口可以由简单的图层来组合,避免了硕大和复杂的继承化子类。图层非常合适于这种堆叠方式来合成复杂的功能。
(2)每个图层定义了一个基于其父图层的坐标系的坐标系。当一个图层变换的时候,它的子图层同样变换。
(3)一个动态的图层树,可以在程序运行的时候重新设置。图层可以创建并添加为一个图层的第一个子图层,然后从其他图层的图层树上面删除。
 
二、在视图里面显示图层

1.核心动画不提供在一个窗口(window)实际显示图层的手段,它们必须通过视图来托管。当视图和图层一起的时候,视图为图层提供了底层的事件处理,而图层为视图提供了显示的内容。

2.iOS上面的视图系统直接建立在核心动画的图层上面。每个UIView的实例会自动的创建一个CALayer类的实例,然后把该实例赋值给视图的layer属性。你可以在需要的时候向视图的图层里面添加子图层。

3.在Mac OS X,您必须配置一个NSView的实例,通过这样一种方式才可以让它托管图层。为了显示图层树的根图层,你可以设置一个视图的图层和配置视图以便使用图层:
  代码:向view中插入layer
  //theView is an existing view in a window
  //theRootLayer is the root layer of a layer tree
  [theView setLayer: theRootLayer];
  [theView setWantsLayer:YES];
  
三、从图层结构里面添加和删除图层

1.简单的实例化一个图层并不意味已经把它插入了一个图层树。而是通过以下的方法来实现从图层树里面添加、插入、替换和删除图层。
(1)addSublayer:
  Appends the layer to the receiver’s sublayers array.
(2)insertSublayer:atIndex:
  Inserts the layer as a sublayer of the receiver at the specified index.
(3)insertSublayer:below:
  Inserts the layer into the receiver’s sublayers array, below the specified sublayer.
(4)insertSublayer:above:
  Inserts the layer into the receiver’s sublayers array, above the specified sublayer.
(5)removeFromSuperlayer
  Removes the receiver from the sublayers array or mask property of the receiver’s superlayer.
(6)replaceSublayer:with:
  Replaces the layer in the receiver’s sublayers array with the specified new layer.
 
2.你也可以通过使用一个图层的数组来设置图层的子图层,甚至可以扩展设置父图层的sublayers属性。当把图层的sublayers属性设置了一个图层的数组值的时候,你必须保证数组里面每个图层的父图层已经被设置为nil。

3.默认情况下从一个可视化图层树里面插入和删除图层将会触发动画。当把一个图层添加为子图层的时候,将会触发父图层返回标识符为kCAOnOrderIn动画。当从图层的子图层里面删除一个图层的时候,将会触发父图层返回一个标识符为kCAOnOrderOut的动画。当替换图层的子图层里面的一个图层的时候,将会触发父图层返回一个标识符为KCATransition的动画。当你操作图层树的时候,你可以禁用动画或者改变使用任何标识符的动画。
 
四、图层的位置调整和大小改变-概述

1.图层创建以后,你可以通过改变图层的几何属性:frame、bounds、position、anchorPoint和zPosition来编程式移动和改变图层大小。

2.如果一个图层的属性needsDisplayOnBoundsChange被设置为YES的时候,当图层的bounds属性改变的时候,图层的内容将会被重新缓存起来。默认情况下图层的needsDisplayOnBoundsChange属性值为NO。

3.默认情况下,设置图层的属性frame、bounds、position、anchorPoint和zPosition属性将会导致图层动画显示新值。
 
五、图层的位置调整和大小改变-自动调整图层大小

1.CALayer提供了一个机制,在父图层被移动或者改变大小的时候,子图层可以自动的跟着移动和调整大小。在很多情况下简单的配置一个图层的自动调整掩码(autoresizing  mask)可以适当的适应程序的行为。

2.一个图层的自动调整掩码可以通过指定CAAutoresizingMask的常量结合或运算(OR)所得的结果赋值给图层的autoresizingMask属性值。下面列举了掩码常量和这些掩码如何影响图层的大小调整行为。
(1)kCALayerHeightSizable
  如果设置了,则layer的高度按比例随父layer的高度变化。
(2)kCALayerWidthSizable 
  如果设置了,则layer的宽度按比例随父layer的宽度变化。
(3)kCALayerMinXMargin
  如果设置了,则layer的左边距按比例随父layer的宽度变化。如果未设置,则layer的左边距保持原来相对父layer的位置。
(4)kCALayerMaxXMargin 
  如果设置了,则layer的右边距按比例随父layer的宽度变化。如果未设置,则layer的右边距保持原来相对父layer的位置。
(5)kCALayerMaxYMargin
  如果设置了,则layer的上边距按比例随父layer的宽度变化。如果未设置,则layer的上边距保持原来相对父layer的位置。
(6)kCALayerMinYMargin
  如果设置了,则layer的下边距按比例随父layer的宽度变化。如果未设置,则layer的下边距保持原来相对父layer的位置。
 
3.例如,为了把保持图层位于它父图层的相对左下角位置,你可以使用kCALayerMaxXMargin |kCALayerMaxYMargin。
  当沿着一个轴具有多个方向被设置为适应可变的时候,那么调整大小的尺寸为使其均匀分布的值。下图提供了一个常量值的位置的图形表示。
   CoreAnimation编程指南(四)图层树结构 - 米安格 - 米安格的博客
 
4.当这些常量里面的任何一个被省略的时候,图层的布局在这个方向上值是固定的。当一个常量包含在图层的自动调整掩码里面的时候,该方向上的图层的布局值是适应可变的。

5.CALayer的子类可以重写函数resizeSublayersWithOldSize:和resizeWithOldSuperlayerSize:来定制化的自动调整图层大小的行为。图层的函数resizeSublayersWithOldSize:将会在bounds属性被修改的时候自动的触发执行,同时发送一个消息resizeWithOldSuperlayerSize:给图层的每个子图层。图层的每个子图层根据自动调整掩码的属性来比较就的边界值和新的边界值来调整它的位置和大小。
 
六、图层的位置调整和大小改变-裁剪子图层
   在Cocoa的视图里面,当子视图超出父视图的边界的时候,视图将会被裁剪以适应父视图的大小。图层去掉了这个限制,允许子层全部显示,无论自己相对于父层位置如何。图层的masksToBounds属性决定了是否子图层是否相对父图层裁剪。该属性masksToBounds的默认值为NO,即防止子图层被相对于父图层裁剪。下图显示了当设置图层的masksToBounds属性导致的结果,和它如何影响layerB和layerC的显示。 
  CoreAnimation编程指南(四)图层树结构 - 米安格 - 米安格的博客

转自梦维:http://www.dreamingwish.com/dream-2012/coreanimation-programming-guide-iv-the-layer-tree-structure.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习散列表

回顾一下简单查找和二分查找 杂货店商品对应的价格举例: 简单查找就是拿出商品价目本,这个价目本并不是有序的,顾客问苹果多少钱,需要一个一个去查找某一个商品的价格,需要O(n)时间。 同样是一个价目本,但…

CoreAnimation编程指南(五)图层内容

当我们使用Cocoa的视图的时候,我们必须继承NSView或者UIView并且重载函数drawRect:来显示任何内容。但是CALayer实例可以直接使用,而无需继承子类。因为CALayer是一个键-值编码兼容的容器类,你可以在实例里面存储任意值,所以子类实…

SHA算法

回顾散列算法 我的上篇文章:学习散列表 在上篇文章杂货铺的示例中,我们希望散列函数的结果是均匀分布的。散列函数接受一个字符串,并返回一 个索引号。 安全散列算法(secure hash algorithm, SHA)函数 给…

CoreAnimation编程指南(六)动画

动画是当今用户界面的关键因素。当使用核心动画的时候,动画是自动完成的。没有动画的循环和计数器。你的应用程序不负负责重绘,也不负责跟踪动画的当前状态。动画在独立线程里面自动执行,没有和你的应用程序交互。本章提供了对动画类的概览&a…

CoreAnimation编程指南(七)图层Action

图层的行为在以下情况发生的时候被触发:从图层树里面插入或者删除一个图层,图层的属性值被修改了,或者程序显式要求。通常情况下,行为触发器是动画显示的结果所在。1.1 行为对象的角色一个行为对象是一个通过CAAction协议响应行为…

python实现搜索之二分查找

搜索 搜索是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的,因为该项目是否存在。 搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找 二分法查找 二分查找又称折半查找,优点是比较次数少&#x…

CoreAnimation编程指南(八)事务

图层的每个改变都是事务的一部分。CATransaction是核心动画类,它负责成批的把多个图层树的修改作为一个原子更新到渲染树。本章介绍了核心动画支持的两种事务。隐式事务和显式事务。1.1 隐式事务当图层树被没有获得事务的线程修改的时候将会自动创建隐式事务&#x…

写SQL语句需要注意的点

先回忆一下DDL和DML 创建表DDL create table t_xx(id int auto_increment primary key, name char(10),...) create table t_student( id int auto_increment primary key , name char(10), 外键id int, foreign key(外键id) references 外表t_class(外表id字段名) );插入数…

CoreAnimation编程指南(九)图层布局

NSView提供了经典的“stuts and springs”模式,用于视图调整大小的时候把关联到它父图层的视图重新调整位置。图层支持该模式,而且Mac OS X上面的核心动画提供了一个更通用的布局管理器机制,允许开发者自己写他们自己的布局管理器。可以为图层…

数据库优化、数据库基础等常用知识点总结

建表优化 1)数据库范式 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。 如电话列可进行拆分—家庭电话、公司电话第二范式(2NF):首先是 1NF,另外包含两…

CoreAnimation编程指南(十)KVC

CAAnimation和CALayer类扩展了NSKeyValueCoding协议,给键添加默认值,扩展了封装协议,支持CGPoint、CGRect、CGSize和CATransform3D关键路径。1.1 键-值编码兼容的容器类CALayer和CAAnimation都是键-值编码兼容的容器类,允许你修改…

CoreImage使用介绍

一、概述CoreImage.framework从iOS5开始启用,它使我们很容易就能处理图片的各种效果,色彩,曝光,饱和度,变形等等。不仅功能强大,而且可以直接使用GPU,效率很高,甚至可以实时的对视频…

一片文章概括大部分python面试基础常考题(部分有详解)

本片文章部分参考地址:https://segmentfault.com/a/1190000018737045 python是动态解释性的强类型定义语言 强类型:不允许不同类型相加。例如:整形字符串会报类型错误。 动态:不使用显示数据类型声明,且确定一个变量…

AssetsLibrary使用介绍

一、概述AssetsLibrary框架:从iOS4.0开始提供,可以通过它获取设备里的图片和视频等资料,以API的方式提供,而且界面式的,比UIImagePickerViewController灵活很多。既可以读又可以写。二、读取资料库中的全部资料1.大概步…

Objective-C成员变量声明方式探究

一、interface和 property 方式声明变量的区别1.你可以单独在interface中定义变量,而不用property定义;也可以只用property去定义,而不在interface中定义,当然用了property去定义,一般要在.m文件中用synthsize去合成相…

web处理高并发措施

高并发处理的思路,从几个方面进行解决 先来了解几个名词 QPS: 每秒处理的请求数量! 响应时间: 处理一个请求需要的时间! 吞吐量: 单位时间内的处理请求数量! 最大并发数: 同一时间能支持的最大请求数! 1、流量处…

经典逻辑编程题(本文用python实现)

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思…

@interface使用详解

1.interface可以实现三种功能&#xff1a;(1)声明类:Class(2)声明类别:Category(3)声明扩展:Extension2.声明类&#xff1a;这个就比较常用了&#xff0c;在这里不多说。代码&#xff1a;interface SomeClass : NSObject <SomeDelegate>{}end3.声明类别&#xff1a;(1)类…

同一账号多处登录问题

思路 用户每次登录时生存一个随机字符串保存在服务器和客户端&#xff0c;用户每次访问验证这个字符串&#xff0c;不通过时则要求用户下线&#xff0c; 如果有两个用户先后分别登录同一个帐号&#xff0c;则后登录的那位产生的字符串必然会覆盖先登录的那位&#xff0c; 然后…

iOS中HTTP请求使用cookie

一、iOS中Http请求对cookie的默认处理&#xff1a;1.一直以为ios的http请求不会自动处理请求中的cookie&#xff0c;所以一直认为客户端请求默认是没有Session的&#xff0c;现在发现自己的想法错了很久。2.NSURLRequest默认的处理过程&#xff1a;类似于服务器端和网页端的ses…