Core Animation的基本使用(十六)
发表于2013/08/25由juluren

layer tree

addSublayer:

将层追加到接受者的子层数组中。

insertSublayer:atIndex:

将层插入到接收者指定的索引位置作为子层。

insertSublayer:below:

将层插入到接受者的子层数组中,位于指定子层的下面。

insertSublayer:above:

将层插入到接受者的子层数组中,位于指定子层的上面。

removeFromSuperlayer

将接收者从子层数组中或者接收者超层的mask属性中移出。

replaceSublayer:with:

用新层替换接收者的子层数组中的层。

你也可以用层的数组设置子层,只要设置超层的sublayers属性。当用层对象的数组设置sublayer属性时,必须确保这些层的superlayer被置为nil。

默认情况下,从一个可见的层树中插入或移出层会出发动画。当层被作为子层添加,父层返回标识为kCAOrderIn动作的动画被触发。当从层的子层中移除一 个层时,父层返回kCAOrderOut动作标识的动画被触发。替换子层中的一个层导致父层返回kCATransition动作标识的动画被触发。你可以 在操作层树时关掉动画,或者用任何动作标识改变动画。

当你使用addSublayer来添加一个子层的是,在把这个子层添加到父层层结构的最上层。所以它将会显示在任何现有层的上面。使用 insertSublayer方法可以再层结构中插入层。

要在一个特殊的索引里面插入层,可以使用atIndex 参数。

[ rootLayer insertSublayer: layer1 atIndex: 1 ];

要在另一个层的上面或者下面插入层,可以使用above 或者 below 参数

[ rootLayer insertSublayer: layer1 below:layer2 ];

[ rootLayer insertSublayer: layer1 above:layer2 ];

要把一个层从父层中删除,可以调用此层的removeFromSuperlayer来删除。

[ layer1 removeFromSuperlayer ];

要用一个不同的层来替换一个已存在的层,可以使用replaceSublayer方法。

[ rootLayer replaceSublayer: layer2 with: layer3 ];

要把一个层留在父层的层结构中,但是不显示它,可以使用层的hidden属性。你可以使用下面的代码来隐藏HUDView显示的内容,而不用去删除它。

– (void) ToggleHUD {

layer1.hidden = (layer2.hidden == NO) ? YES : NO;

}

当rootLayer物体在屏幕上显示时,所有所有sublayer层将合并渲染。每类负责自己的层,但是当rootLayer被画到屏幕上的时候,所有layer将合并在一起。

该rootLayer不是可以唯一添加的层。子层可以有自己的子层,这样整个有层次的体系才能被建立。例如,你可以向layer1增加一个层,来显示 下层的组件。例如一个团队的标志。

对层重新定位和调整大小

在层被创建后,你可以移动和调整他的大小,只需简单的改变层的几何属性:frame,bounds,position或者zPosition。

如果一个层的needsDisplayOnBoundsChange属性为YES,当层的bounds改变时层的内容将会被重新缓存。默认情况下,needsDisplayOnBoundsChange属性是NO。

默认情况下,设置frame,bounds,position,anchorPoint和zPosition属性,会让层以动画方式改变到新值。

example:

// Create the tach’s background layer

tachLayer = [CALayer layer];

tachLayer.bounds = CGRectMake(0, 0, 250, 250);

tachLayer.position = CGPointMake(200, 500);

tachLayer.contents = (id)[UIImage imageNamed:@"speed.png"].CGImage;

CALayer *L1 = [CALayer layer];

L1.frame = CGRectMake(0, 0, 100, 100);

UIColor *c1 = [UIColor redColor];

L1.name = @"L1";

[L1 setBackgroundColor:(c1.CGColor)]; // 因为layer setBackgroundColor用到的是CGColor所以要进行一次转换

CALayer *L2 = [CALayer layer];

L2.frame = CGRectMake(50, 50, 100, 100);

UIColor *c2 = [UIColor blueColor];

L2.name = @"L2";

[L2 setBackgroundColor:(c2.CGColor)];

CALayer *L3 = [CALayer layer];

L3.frame = CGRectMake(50, 0, 100, 100);

UIColor *c3 = [UIColor greenColor];

L3.name = @"L3";

[L3 setBackgroundColor:(c3.CGColor)];

CALayer *L4 = [CALayer layer];

L4.frame = CGRectMake(0, 50, 100, 100);

UIColor *c4 = [UIColor grayColor];

L4.name = @"L4";

[L4 setBackgroundColor:(c4.CGColor)];

[self.view.layer addSublayer:tachLayer];

//以上是基本的Layer设定,下面是操作subLayer的例子

[ tachLayer addSublayer: L2];

[ tachLayer addSublayer: L1];

[ tachLayer insertSublayer: L2 atIndex: 1 ];

[ tachLayer insertSublayer: L1 atIndex: 2 ];

[ tachLayer insertSublayer: L2 atIndex: 3 ];

[ tachLayer insertSublayer: L3 atIndex: 1 ];

[ tachLayer insertSublayer: L4 atIndex: 0 ];

[ tachLayer addSublayer: L2];

执行到此的效果

L2.name = @"L2A";

[ tachLayer addSublayer: L2];

[ tachLayer insertSublayer: L3 atIndex: 0.7 ];

[ tachLayer insertSublayer: L2 below:L1];

[ tachLayer insertSublayer: L3 above:L1];

[ tachLayer insertSublayer: L4 above:L1];

到此的结果

[ L1 removeFromSuperlayer ];

[ tachLayer replaceSublayer: L3 with:L4 ];

[ tachLayer replaceSublayer: L2 with:L1 ];

L4.hidden = YES;

L1.zPosition = 5;

for (CALayer *layer in tachLayer.sublayers) {

//for (int i=0;i%@",layer.name);

}

实际剩下的subLayer

2012-12-13 00:33:00.733 myTest16[66113:c07] subLayer is =>L1

2012-12-13 00:33:00.734 myTest16[66113:c07] subLayer is =>L4

layer层次的更多相关文章

  1. 跟我一起云计算(6)——openAPI

    介绍 Open API即开放API,也称开放平台. 所谓的开放API(OpenAPI)是服务型网站常见的一种应用,网站的服务商将自己的网站服务封装成一系列API(Application Program ...

  2. iOS 开发--动画

    在iOS开发中,制作动画效果是最让开发者享受的环节之一.一个设计严谨.精细的动画效果能给用户耳目一新的效果,吸引他们的眼光 —— 这对于app而言是非常重要的.我们总是追求更为酷炫的实现,如果足够仔细 ...

  3. 【转载】跟我一起云计算(6)——openAPI

    http://www.cnblogs.com/skyme/p/3435565.html 介绍 Open API即开放API,也称开放平台. 所谓的开放API(OpenAPI)是服务型网站常见的一种应用 ...

  4. UIView的动画之初步学习

    animateWithDuration:<#(NSTimeInterval)#> delay:<#(NSTimeInterval)#> options:<#(UIView ...

  5. CSS–Some Structure

    Some Structure About CSS Layout Position,Layer[层次] Box Model Visual Formatting Model BFC[block forma ...

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

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

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

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

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

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

  9. Core Animation 文档翻译 (第五篇)

      构建Layer层次结构 在APP中大多数情况下,将Layer和View对象结合使用是Layer最好的使用方式.然而,很多时候我们可能需要通过添加单独的Layer对象,以便增加视图继承层次:当为了提 ...

随机推荐

  1. ORACLE PL/SQL 实例精解之第四章 条件控制:if 语句

    4.1 IF 语句 IF语句两种形式:IF-THEN IF-THEN-ELSE 使用IF-THEN,可以指定需要执行的一组动作. IF-THEN-ELSE语句指定两组动作 1. IF-THEN TRU ...

  2. Codeforces - 559B - Equivalent Strings - 分治

    http://codeforces.com/problemset/problem/559/B 这个题目,分治就好了,每次偶数层可以多一种判断方式,判断它的时间就是logn的(吧),注意奇数层并不是直接 ...

  3. STL排序和检索

    //参考书是刘汝佳的那本算法书P108 //sort的用法也就是本来是从小到大排序,如果想要从大到小,中间写一个比较函数就可以了: //以下两个检索的东西 //lower_bound找到一个值的最小插 ...

  4. 【弱的C艹之路。。未完待续】

    [弱的C艹之路] 数据范围 unsigned int 0-4294967295 int 2147483648-2147483647 unsigned long 0-4294967295 long 21 ...

  5. alternatives 命令学习

    最经在捣鼓Cloudera的cdh ,发现里面使用了alternatives命令,由于不懂这个命令,让我走了好多弯路. 现在mark一下 ubuntu 12.04 系统的命令为:update-alte ...

  6. 如果没有intelliJ 编译器?

    刚刚是了一晚上的用记事本来写代码,脱离编译器,发现自己完全废了. 写了好多个类,在命令行编译失败,上网查错误,说编码问题, 编码问题解决后,命令行还是编译失败,粘贴到编译器 发现完全是自己代码能力太弱 ...

  7. USACO Training3.1联系【排序终极题目】By cellur925

    题目传送门 这题我们很容易想到直接枚举即可.算法本身并没有什么难度但是细节超多!于是这题整整卡了一天....... (不,还是我太弱了.) 期间还暴露出一些平时没有特别注意的问题,这次一起解决. 开始 ...

  8. oracle常用的一些查询命令

    .查看所有用户 select * from dba_users; select * from all_users; select * from user_users; .查看用户或角色系统权限(直接赋 ...

  9. 牛客练习赛25-A-因数个数和

    题目描述 q次询问,每次给一个x,问1到x的因数个数的和. 输入描述: 第一行一个正整数q:接下来q行,每行一个正整数x 输出描述: 共q行,每行一个正整数表示答案 输入 4 1 2 3 10 输出 ...

  10. SpringCloud开发学习总结(七)—— 声明式服务调用Feign(二)

    参数绑定 在上一章的示例中,我们使用Spring Cloud Feign实现的是一个不带参数的REST服务绑定.然而现实系统中的各种业务接口要比它复杂得多,我们有时会在HTTP的各个位置传入各种不同类 ...