在iOS上,为什么设置一个图层的sublayerTransform将自己变成像CATranformLayer一样?
众所周知,图层的zPosition
只决定哪个图层覆盖哪个图层。 无论是10人还是1000人,都不会影响其地位。
也就是说,除非我们使用CATransformLayer
来包含这些图层 ,那么这些图层的zPosition
会影响图层的位置。
但是,在iOS 5.1.1中运行的以下代码确实使zPosition
改变了图层的位置…您可以在新的Single View App中尝试它,并将以下代码添加到ViewController.m
。 如果layer2
的zPosition
从88
改变到188
,我们可以看到图层相应的移动。 所以没有CATransformLayer
在代码中; 为什么会这样呢? (请引用Apple文档或任何参考)。
另外相关的是,如果行self.view.layer.sublayerTransform = transform3D;
更改为self.view.layer.transform = transform3D;
那么该zPosition
将不会对该位置产生影响。 但根据苹果文档, transform
和sublayerTransform
transform
仅在自我转换与否方面有所不同 :
两个图层属性指定了变换matrix:
transform
和sublayerTransform
。 由transform property
指定的matrixtransform property
应用于图层及其子图层相对于图层的anchorPoint
。 […]由sublayerTransform
属性指定的matrix仅应用于图层的子图层,而不是图层本身。
所以很奇怪,为什么改变它会使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]; }
为了真正理解图层transform
和sublayerTransform
属性之间的区别,我认为从这个angular度考虑一个带有3D内容的电视是很有用的。 看看我在Swift操场上修改过的代码版本 。
这里是开始的版本:你有一个电视的内容不包括任何透视转换。 因此,即使围绕y轴旋转,您的内容(橙色和黄色的两个子图层)看起来也是平坦的。 几乎你所期望的正射投影。
但是,如果您保持电视机静止不动,但透视投影将您的内容转换为下面的video,现在您可以立即看到内容的深度。 你添加的子层的位置确实起到了给你一种深度感的重要作用, 它的定义也是如此。 这正是sublayerTransform
工作原理:只转换内容,而不转换电视本身。
现在,如果我使用transform
而不是sublayerTranform
,会是什么样sublayerTranform
? 想象一下,不要仅仅转换内容,而是将整个电视连同屏幕上的内容一起旋转,你会看到预期的结果:
所以,是的,显然transform
和sublayerTransform
在处理子层的zPosition
时performance得大不相同,尽pipe文档没有明确地这样说 。 子图层的zPosition
对其父图层的zPosition
没有影响,但是在其父层的zPosition
上提供了正常的3D效果。
我们可以把这个图层看成一个坐标图层,当我们从3D变换一个图层时,它的坐标变成了3D,但是它的子图层仍然显示为2D,但是当设置子图层从3D变换时,图层将使得它的所有子图层显示为3D。与旋转一样