众所周知,层的zPosition
只决定哪一层覆盖哪一层。 zPosition
是 10 还是 1000 都不会影响它的位置。
也就是说,除非我们use CATransformLayer
to contain those layers , 那么这些层的 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
对位置没有影响。但是according to the Apple docs, transform
and sublayerTransform
only differ in whether self is transformed or not :
Two layer properties specify transform matrices:
transform
andsublayerTransform
. The matrix specified by thetransform property
is applied to the layer and its sublayers relative to the layer'sanchorPoint
. [...] The matrix specified by thesublayerTransform
property is applied only to the layer’s sublayers, rather than to the layer itself.
所以奇怪的是,为什么改变它会导致 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];
}
最佳答案
我们可以把layer看成一个坐标层,当我们把一个layer从3D转成3D时,它的坐标变成了3D,但是它的subLayer仍然显示为2D,但是当设置sublayer transfrom3D时,layer会把它的所有子层都显示为3D。和旋转一样
关于ios - 在 iOS 上,为什么设置层的 sublayerTransform 会使其自身像 CATranformLayer 一样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10917380/