На 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. Довольно многое, что вы ожидаете от орфографической проекции.
Однако, если вы все еще держите телевизор, но преобразовываете его контент под перспективную проекцию, теперь вы сразу видите глубину своего контента. zPosition
добавляемых вами подслоев действительно играет важную роль в том, чтобы дать вам ощущение глубины, и по праву это можно сделать его определение, Это как раз работает sublayerTransform
: преобразует только содержимое, но не сам телевизор.
Теперь, как бы это выглядело, если я использую transform
вместо sublayerTranform
? Представьте, что вы не трансформируете только содержимое, но вращайте весь телевизор вместе с содержимым, прикрепленным к экрану, и вы увидите ожидаемый результат:
Итак, да, по-видимому, transform
и sublayerTransform
ведут себя по-разному, когда речь идет о лечении zPosition
подслоев, хотя документация doesn 't прямо сказать так. Подслой zPosition
не влияет на его родительский transform
, но обеспечивает нормальный 3D-эффект для его родительского sublayerTransform
.
Ответ 2
мы можем рассматривать этот слой как координатный слой, когда мы делаем слой transfrom3D, он координируется, становясь 3D, но его субслой по-прежнему отображается как 2D, но при установке подслоя transfrom3D, слой сделает весь его подуровень отображаемым как 3D. это то же самое, что вращение