На iOS, почему настройка слоя sublayerTransform превращается в себя, как CATranformLayer?

Известно, что zPosition слоев определяет, какой слой покрывает слой. Является ли это zPosition 10 или 1000, не повлияет на его положение.

То есть, если мы не используем CATransformLayer, чтобы содержать эти слои, то zPosition этих слоев повлияет на слои, положение.

Однако следующий код, запущенный в iOS 5.1.1, делает zPosition изменением положения слоев... вы можете попробовать его в новом приложении Single View и добавить следующий код в ViewController.m. Если zPosition of layer2 изменен с 88 на 188, мы видим, что слой движется соответственно. Таким образом, no CATransformLayer находится в коде; почему он будет так себя вести? (Пожалуйста, укажите документы Apple или любую ссылку).

Также связано, если строка self.view.layer.sublayerTransform = transform3D; изменена на self.view.layer.transform = transform3D;, тогда zPosition не будет влиять на позицию. Но в соответствии с документами Apple, transform и sublayerTransform отличаются только тем, преобразуется ли я сам или нет:

Свойства двух слоев задают матрицы преобразования: 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];    

}

Ответ 1

Чтобы действительно понять разницу между свойствами слоя transform и sublayerTransform, я думаю, что полезно подумать об этом с точки зрения просмотра телевизора с 3D-контентом в нем. Проверьте мою измененную версию вашего кода на игровой площадке Swift.

Здесь начальная версия: у вас есть телевизор с контентом, который не имеет никакого преобразования перспективы. Поэтому ваш контент (два оранжевых и желтых подслоев) выглядит плоским даже при вращении вокруг оси y. Довольно многое, что вы ожидаете от орфографической проекции.

.none option

Однако, если вы все еще держите телевизор, но преобразовываете его контент под перспективную проекцию, теперь вы сразу видите глубину своего контента. zPosition добавляемых вами подслоев действительно играет важную роль в том, чтобы дать вам ощущение глубины, и по праву это можно сделать его определение, Это как раз работает sublayerTransform: преобразует только содержимое, но не сам телевизор.

.sublayerTransform option

Теперь, как бы это выглядело, если я использую transform вместо sublayerTranform? Представьте, что вы не трансформируете только содержимое, но вращайте весь телевизор вместе с содержимым, прикрепленным к экрану, и вы увидите ожидаемый результат:

.transform option

Итак, да, по-видимому, transform и sublayerTransform ведут себя по-разному, когда речь идет о лечении zPosition подслоев, хотя документация doesn 't прямо сказать так. Подслой zPosition не влияет на его родительский transform, но обеспечивает нормальный 3D-эффект для его родительского sublayerTransform.

Ответ 2

мы можем рассматривать этот слой как координатный слой, когда мы делаем слой transfrom3D, он координируется, становясь 3D, но его субслой по-прежнему отображается как 2D, но при установке подслоя transfrom3D, слой сделает весь его подуровень отображаемым как 3D. это то же самое, что вращение