2010-03-09 3 views
2

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

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

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]; 

Вложенный слой плоский при повороте.

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

ответ

2

трюк заключается в использовании CATransformLayer в качестве подуровня.

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