zoukankan      html  css  js  c++  java
  • layer层次

    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<[tachLayer.sublayers count];i++) //[layer removeFromSuperlayer]; NSLog(@"subLayer is =>%@",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
  • 相关阅读:
    Qt计算器开发(三):执行效果及项目总结
    [HNOI2019]校园旅行
    How to fix nuget Unrecognized license type MIT when pack
    How to fix nuget Unrecognized license type MIT when pack
    git 通过 SublimeMerge 处理冲突
    git 通过 SublimeMerge 处理冲突
    git 上传当前分支
    git 上传当前分支
    gif 格式
    gif 格式
  • 原文地址:https://www.cnblogs.com/yulang314/p/3728464.html
Copyright © 2011-2022 走看看