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