2012年12月15日 星期六

Core Animation的基本使用(十六)

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




沒有留言: