在iOS上,为什么设置一个图层的sublayerTransform将自己变成像CATranformLayer一样?

众所周知,图层的zPosition只决定哪个图层覆盖哪个图层。 无论是10人还是1000人,都不会影响其地位。

也就是说,除非我们使用CATransformLayer来包含这些图层 ,那么这些图层的zPosition会影响图层的位置。

但是,在iOS 5.1.1中运行的以下代码确实使zPosition改变了图层的位置…您可以在新的Single View App中尝试它,并将以下代码添加到ViewController.m 。 如果layer2zPosition88改变到188 ,我们可以看到图层相应的移动。 所以没有CATransformLayer在代码中; 为什么会这样呢? (请引用Apple文档或任何参考)。

另外相关的是,如果行self.view.layer.sublayerTransform = transform3D; 更改为self.view.layer.transform = transform3D; 那么该zPosition将不会对该位置产生影响。 但根据苹果文档, transformsublayerTransform transform仅在自我转换与否方面有所不同 :

两个图层属性指定了变换matrix: transformsublayerTransform 。 由transform property指定的matrixtransform property应用于图层及其子图层相对于图层的anchorPoint 。 […]由sublayerTransform属性指定的matrix仅应用于图层的子图层,而不是图层本身。

所以很奇怪,为什么改变它会使self.view.layerCATransformLayer

 -(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]; } 

为了真正理解图层transformsublayerTransform属性之间的区别,我认为从这个angular度考虑一个带有3D内容的电视是很有用的。 看看我在Swift操场上修改过的代码版本 。

这里是开始的版本:你有一个电视的内容不包括任何透视转换。 因此,即使围绕y轴旋转,您的内容(橙色和黄色的两个子图层)看起来也是平坦的。 几乎你所期望的正射投影。

.none选项

但是,如果您保持电视机静止不动,但透视投影将您的内容转换为下面的video,现在您可以立即看到内容的深度。 你添加的子层的位置确实起到了给你一种深度感的重要作用, 它的定义也是如此。 这正是sublayerTransform工作原理:只转换内容,而不转换电视本身。

.sublayerTransform选项

现在,如果我使用transform而不是sublayerTranform ,会是什么样sublayerTranform ? 想象一下,不要仅仅转换内容,而是将整个电视连同屏幕上的内容一起旋转,你会看到预期的结果:

.transform选项

所以,是的,显然transformsublayerTransform在处理子层的zPosition时performance得大不相同,尽pipe文档没有明确地这样说 。 子图层的zPosition对其父图层的zPosition没有影响,但是在其父层的zPosition上提供了正常的3D效果。

我们可以把这个图层看成一个坐标图层,当我们从3D变换一个图层时,它的坐标变成了3D,但是它的子图层仍然显示为2D,但是当设置子图层从3D变换时,图层将使得它的所有子图层显示为3D。与旋转一样