众所周知,zPosition
层数只决定了哪一层覆盖哪一层。无论是zPosition
10 还是 1000 都不会影响其位置。
也就是说,除非我们使用CATransformLayer
包含那些图层,否则zPosition
这些图层的 将影响图层的位置。
但是,在 iOS 5.1.1 中运行的以下代码确实会zPosition
改变图层的位置...您可以在新的 Single View App 中尝试,并将以下代码添加到ViewController.m
. 如果 的zPosition
由layer2
变为88
,188
我们可以看到图层相应地移动。所以CATransformLayer
代码中没有;为什么会这样?(请引用 Apple 文档或任何参考资料)。
同样相关的是,如果将线self.view.layer.sublayerTransform = transform3D;
更改为,self.view.layer.transform = transform3D;
则zPosition
将不会影响位置。但根据 Apple 文档,transform
仅sublayerTransform
在 self 是否被转换方面有所不同:
两个层属性指定变换矩阵:
transform
和sublayerTransform
。由 指定的矩阵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];
}