2010-03-09 6 views
2

J'essaie d'utiliser CALayers pour créer un effet de style 3D dans l'une de mes applications. Cependant, il semble que CALayers imbriqués n'ont pas de perspective appliquée à eux.Les CALayers imbriqués ne détectent pas la transformation de perspective

Pour illustrer avec pseudo-code, si j'ai une couche avec une perspective appliquée comme ceci:

CATransform3D subLayerTransform = CATransform3DIdentity; 

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

Ajouter, puis ajoutez une couche à elle comme ceci:

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

La perspective est appliquée comme prévu. Cependant, si je devais essayer de couches de nid plus

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

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

La couche imbriquée est plat lors d'une rotation. C'est comme si superLayer n'appliquait la transformation qu'aux couches qui se trouvent directement sous la hiérarchie des couches. Est-ce le cas? Ou est-ce que je fais quelque chose de mal?

Répondre

2

l'astuce consiste à utiliser une CATransformLayer comme sous-couche.

Comme cette couche "n'affiche" rien, vous devrez ajouter des CALayers traditionnels en tant qu'enfants de CATransformLayer pour faire le travail d'affichage du contenu. Mais ce qu'il fait est un excellent travail de maintenir un espace de coordonnées d'objet, puis d'appliquer les transformations appropriées à ses couches enfants.