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)函数 给…

python实现搜索之二分查找

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

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

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

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

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

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

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

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

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

CoreData简介

一、概念 1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型 3.好处:能够合理管理内存,避免使用sql的麻烦,高效…

NSZombieEnabled使用

我们做iOS 程序开发时经常用遇到 EXC_BAD_ACCESS 错误导致 Crash,出现这种错误时一般 Xcode 不会给我们太多的信息来定位错误来源,只是在应用 Delegate 上留下像Thread 1: Program received signal:"EXC_BAD_ACCESS",让问题无从找起…

通过终端,查看sqlite3的存储文件

在调试应用的时候,可以查看数据库里的数据。 1、定位到模拟器的目录 cd ~/Library/Application\ Support/iPhone\ Simulator 2、查找文件名包含 OrgChart.sqlite的文件,并打印路径 find . -name "OrgChart.sqlite" –print 输出: .…

iOS的事件分发

移动平台上的开发主要关注数据以及数据的处理,事件的处理以及UI。所以事件的分发处理是很重要的一个环节,对于一个平台的优劣来说也是一项重要的参数。如果事件的分发设计的不好,一些复杂的UI场景就会变得很难写甚至没法写。从小屏没有触摸的…

iOS开发ARC入门和使用

本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流和讨论。请不要将本文的部分或全部内容用于商用,谢谢合作。 欢迎转载本文,但是转载请注明本文出处:http://www.onevcat.com/2012/06/arc-hand-by-han…

UIBezierPath 的使用介绍

使用UIBezierPath类可以创建基于矢量的路径。此类是Core Graphics框架关于path的一个封装。使用此类可以定义简单的形状,如椭圆或者矩形,或者有多个直线和曲线段组成的形状。1.Bezier Path 基础UIBezierPath对象是CGPathRef数据类型的封装。path如果是基…

iOS中的XML解析

解析方式分类: 解析 XML 通常有两种方式,DOM 和 SAX:DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。 iOS中XML解析是…

iOS中bundle的使用

一、概述1.在我们使用第三方框架时,常常看到XXX.bundle的文件。我们找到该文件,显示包内容,大致看到很多资源文件:图片、配置文本、XIB文件……2.什么是Bundle文件:简单理解,就是资源文件包。我们将许多图片…

CoreData 自定义数据类型

在CoreData中,Entity中Attribute的类型只有固定的几种可选。如下图: 如果我们要想直接存放UIImage到数据库,如何做? 1.在coredata中新建的attribute中类形选择Transformable. 意思表示这个字段是自定义的类型。 2.在生成的NSMana…

CoreData并发操作模式简介

iOS5.0中,苹果为CoreData的并发处理添加了两个内容。一、首先介绍第一个内容:CoreData框架中的NSManagedObjectContext类增加新的初始化方法:initWithConcurrencyType:(NSManagedObjectContextConcurrencyType)ct;1.参数方法介绍:…

【Linux系统基础】(3)在Linux上部署运维监控Zabbix和Grafana

目录 运维监控Zabbix部署简介安装安装前准备 - Mysql安装Zabbix Server 和 Zabbix Agenta. 安装Zabbix yum库b. 安装Zabbix Server、前端、Agentc. 初始化Mysql数据库d. 为Zabbix Server配置数据库e. 配置Zabbix的PHP前端 配置zabbix 前端(WEB UI) 运维监…

HashMap源码解释

HashMap 前言: 本文的hashMap是基于jdk1.7的hashMap. 关于jdk1.8的hashMap在另一篇中,那里将会介绍与1.7的差异与优势 首先基础知识介绍: 1.HashMap的成员变量   int DEFAULT_INITIAL_CAPACITY 16&#xff1a;默认的初始容量为2 ^ 4   int MAXIMUM_CAPACITY 1 <<…