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

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

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

Однако следующий код, работающий в iOS 5.1.1, делает zPosition изменить положение слоев... вы можете попробовать его в новом приложении Single View и добавить следующий код в ViewController.m, Если zPosition из layer2 изменен с 88 в 188, мы можем видеть, что слой движется соответственно. Так нет 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];    

}

2 ответа

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

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

.не вариант

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

Опция.sublayerTransform

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

опция.transform

Так что да, видимо transform а также sublayerTransform ведут себя совершенно иначе, когда дело доходит до лечения zPosition подслоев, хотя документация явно не говорит об этом. Подслой zPosition не влияет на родителей transform, но обеспечивает нормальный эффект 3D на своих родителей sublayerTransform,

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

Другие вопросы по тегам