在iOS上,为什么设置图层的sublayerTransform会使其自身像CATranformLayer一样?

nop*_*ole 7 core-animation calayer catransform3d ios catransformlayer

众所周知,zPosition层中的层仅确定哪个层覆盖哪个层.无论是zPosition10还是1000,都不会影响其地位.

也就是说,除非我们使用CATransformLayer包含这些图层,否则zPosition这些图层将影响图层的位置.

但是,在iOS 5.1.1中运行的以下代码确实可以zPosition改变图层的位置...您可以在新的单视图应用程序中尝试它,并添加以下代码ViewController.m.如果zPositionof layer2更改为88to 188,我们可以看到图层相应地移动.所以CATransformLayer代码中没有; 它为什么会这样?(请引用Apple文档或任何参考).

另外相关的是,如果线self.view.layer.sublayerTransform = transform3D;被改变为self.view.layer.transform = transform3D; 那么zPosition将对位置没有影响.但根据苹果的文档,transform并且sublayerTransform只有在自我是否转化或者没有不同:

两层属性指定转换矩阵:transformsublayerTransform.由the指定的矩阵transform property应用于层及其子层相对于层的 anchorPoint.[...] sublayerTransform属性指定的矩阵 仅应用于图层的子图层,而不是图层本身.

所以奇怪的是,为什么要改变它会导致self.view.layer像一个人CATransformLayer.

-(void) viewDidAppear:(BOOL)animated {

    CATransform3D transform3D = CATransform3DIdentity;

    transform3D.m34 = -1.0 / 1000;

    transform3D = CATransform3DRotate(transform3D, M_PI / 4, 0, 1, 0);

    self.view.layer.sublayerTransform = transform3D;

    CALayer *layer1 = [[CALayer alloc] init];
    layer1.zPosition = 33;
    layer1.frame = CGRectMake(100, 100, 100, 100);
    layer1.backgroundColor = [[UIColor orangeColor] CGColor];

    [self.view.layer addSublayer:layer1];

    CALayer *layer2 = [[CALayer alloc] init];
    layer2.zPosition = 88;
    layer2.frame = CGRectMake(100, 120, 100, 100);
    layer2.backgroundColor = [[UIColor yellowColor] CGColor];

    [self.view.layer addSublayer:layer2];    

}
Run Code Online (Sandbox Code Playgroud)

sig*_*nal 0

我们可以把图层看成是一个坐标图层,当我们把一个图层设置为transfrom3D时,它的坐标变成了3D,但是它的子图层仍然显示为2D,但是当设置子图层transfrom3D时,该图层会让它的所有子图层显示为3D。与旋转相同