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

标签 ios core-animation calayer catransform3d catransformlayer

众所周知,层的zPosition只决定哪一层覆盖哪一层。 zPosition 是 10 还是 1000 都不会影响它的位置。

也就是说,除非我们use CATransformLayer to contain those layers , 那么这些层的 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 对位置没有影响。但是according to the Apple docs, transform and sublayerTransform only differ in whether self is transformed or not :

Two layer properties specify transform matrices: transform and sublayerTransform. The matrix specified by the transform property is applied to the layer and its sublayers relative to the layer's anchorPoint. [...] The matrix specified by the sublayerTransform property is applied only to the layer’s sublayers, rather than to the layer itself.

所以奇怪的是,为什么改变它会导致 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];    

}

最佳答案

我们可以把layer看成一个坐标层,当我们把一个layer从3D转成3D时,它的坐标变成了3D,但是它的subLayer仍然显示为2D,但是当设置sublayer transfrom3D时,layer会把它的所有子层都显示为3D。和旋转一样

关于ios - 在 iOS 上,为什么设置层的 sublayerTransform 会使其自身像 CATranformLayer 一样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10917380/

相关文章:

ios - 将 CoreData NSManagedObject 发送给 Game Center 中的另一个玩家

ios - 表格 View 行高变化时如何添加动画?

ios - CALayer (CAAnimation) 可动画属性绘制错误

ios - CATextLayer 属性 foregroundColor 和 fontSize 的 CABasicAnimation 有时无法工作

ios - 应用图层蒙版后我的图像按比例缩小

ios - 在不移除混音器总线或停止/启动图的情况下停止总线渲染回调

ios - Ivar 显示 null,尽管它被强引用、初始化和分配

ios - 如何将 CLCircularRegion 保存到 NSUserDefaults

ios - CAShapeLayer 在动画 Swift 期间检测触摸

iphone - 屏幕上 CALayers 的混合模式?那可能吗?