Вложенные CALayers не собирают перспективное преобразование - PullRequest
2 голосов
/ 10 марта 2010

Я пытаюсь использовать CALayers для создания эффекта стиля 3D в одном из моих приложений. Однако, похоже, что вложенные слои CALay не имеют перспективы, примененной к ним.

Чтобы проиллюстрировать псевдокодом, если у меня есть слой с перспективой, примененной так:

CATransform3D subLayerTransform = CATransform3DIdentity;

/* set perspective */
subLayerTransform.m34 = -0.002;
superLayer.sublayerTransform = subLayerTransform;

добавить, а затем добавить слой к нему так:

CALayer *sublayer = [CALayer layer];
sublayer.frame = layerFrame;
sublayer.contents = (id)[image CGImage];
[superLayer addSublayer: sublayer];

Перспектива применяется, как и ожидалось. Однако, если бы я попытался вложить слои дальше

CALayer *sublayer = [CALayer layer];
[superLayer addSublayer: sublayer];

CALayer *nestedlayer = [CALayer layer];
nestedlayer.frame = layerFrame;
nestedlayer.contents = (id)[image CGImage];
[sublayer addSublayer: nestedlayer];

При вращении вложенный слой является плоским.

Как будто суперслой применяет преобразование только к слоям, которые находятся непосредственно под ним в иерархии слоев. Это тот случай? Или я что-то не так делаю?

1 Ответ

2 голосов
/ 10 марта 2010

Хитрость заключается в том, чтобы использовать CATransformLayer в качестве подслоя.

Поскольку этот слой на самом деле ничего не «отображает», вам потребуется добавить традиционные CALayers в качестве дочерних элементов CATransformLayer, чтобы выполнить работу по отображению контента. Но он делает отличную работу по поддержанию координатного пространства объекта и затем применяет соответствующие преобразования к его дочерним слоям.

...