在iOS上,为什么设置图层的sublayerTransform把自己表现得像CATranformLa

2019-07-29 18:09发布

已知的是,在zPosition的层的唯一确定哪个层掩盖该层。 无论是zPosition的10或1000不会影响其位置。

也就是说,除非如果我们使用CATransformLayer包含这些层 ,然后将zPosition的层会影响层位置。

然而,在IOS 5.1.1运行下面的代码确实让zPosition改变层的位置......你可以尝试在一个新的单一视图应用程序,和下面的代码添加到ViewController.m 。 如果zPositionlayer2从改变88188 ,可以看出,该层相应地移动。 因此,没有CATransformLayer是在代码; 为什么会是那样做的? (请注明苹果文档或任何参考)。

还相关的是,如果线路self.view.layer.sublayerTransform = transform3D; 被改变为self.view.layer.transform = transform3D; 那么zPosition将有上的位置没有影响。 但根据苹果的文档, transformsublayerTransform只有在自我是否转化或者没有不同 :

两个层属性指定变换矩阵: transformsublayerTransform 。 由指定的矩阵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];    

}

Answer 1:

要真正了解一个层之间的差异transformsublayerTransform性质,我认为在寻找与它的3D内容的电视方面认为这是有益的。 看看我的代码的修改版本中斯威夫特游乐场 。

下面是开始版本:你有内容,包括无透视变换的任何一台电视机。 因此,你的内容(这两个橙色和黄色子层)相貌平平甚至绕Y轴旋转。 几乎你所期望的正投影什么。

但是,如果你把你的电视还在,但透视投影变换下的内容,现在您可以立即看到你的内容的深度。 该zPosition的子层的加入,你在真正给你的深度感发挥的重要组成部分,是理所当然的由它的定义 。 这究竟是如何sublayerTransform作品:只改造的内容,而不是电视本身。

现在,那会是什么样子,如果我使用transform ,而不是sublayerTranform ? 试想一下,不只是改造的内容,但贴在屏幕上的内容一起旋转整个电视 ,你会看到预期的结果:

所以,是的,显然transformsublayerTransform表现完全不同,当谈到治疗zPosition的子层,尽管该文件没有明确这么说 。 一个子层的zPosition对其父没有效果transform ,但确实提供了其父的正常3D效果sublayerTransform



Answer 2:

我们可以认为该层为坐标层,当我们做一个层transfrom3D,它的坐标成为3D,但其子仍显示为2D,但设置子transfrom3D时,该层将其所有的子显示为3D.it是相同的旋转



文章来源: On iOS, why does setting a layer's sublayerTransform turn itself to act like CATranformLayer?