На 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. это то же самое, что вращение