199 votes

Comment puis-je demander une transformation de perspective à un UIView ?

Je suis à la recherche pour effectuer une transformation de perspective sur un UIView (tel que vu dans coverflow)

Anyonew sait-il si cela est possible ?

J’ai étudié à l’aide de `` et ont parcouru tous le programmeur pragmatique podcasts de Core Animation, mais je ne suis toujours pas plus clair sur la façon de créer ce genre de transformation sur un iPhone.

D’aide, des pointeurs ou des extraits de code exemple seraient vraiment appréciées !

332voto

Brad Larson Points 122629

Comme dit Ben, vous aurez besoin de travailler avec le UIView de la couche, à l'aide d'un CATransform3D pour effectuer la couche de rotation. L'astuce pour obtenir la perspective de travail, comme décrit ici, est, d'accéder directement à l'une des cellules de la matrice de la CATransform3D (m34). Matrice de mathématiques n'a jamais été mon truc, donc je ne peux pas expliquer exactement pourquoi cela fonctionne, mais il le fait. Vous aurez besoin de mettre cette valeur à une valeur négative de la fraction pour votre initiale transformer, puis appliquez votre couche de rotation transforme. Vous devez également être en mesure d'effectuer les opérations suivantes:

UIView *myView = [[self subviews] objectAtIndex:0];
CALayer *layer = myView.layer;
CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
rotationAndPerspectiveTransform.m34 = 1.0 / -500;
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 45.0f * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
layer.transform = rotationAndPerspectiveTransform;

qui reconstruit la couche de transformer à partir de zéro pour chaque rotation.

Un exemple complet de ce (avec code) peut être trouvé ici, où j'ai mis en place tactile, rotation et mise à l'échelle sur un couple de CALayers, basée sur un exemple par le projet de Loi Dudney. La plus récente version du programme, tout en bas de la page, met en œuvre ce genre de point de vue fonctionnement. Le code devrait être assez simple à lire.

Le sublayerTransform vous vous référez dans votre réponse est une transformation qui est appliqué à la sous-couches de votre UIView de l' CALayer. Si vous n'avez pas de sous-couches, ne vous inquiétez pas à ce sujet. J'utilise le sublayerTransform dans mon exemple, tout simplement parce qu'il y a deux CALayers contenues à l'intérieur de la première couche qui je suis en rotation.

13voto

Markus Points 194

Un très, très bon article sur la transformation 3D CALayer et point de vue, y compris une explication détaillée du champ m34, se trouve dans cet excellent article :

Core-animation-3d-modèle

7voto

Ben Gottlieb Points 59900

Vous pouvez uniquement utiliser les Graphiques de Base (Quartz, 2D uniquement) transforme directement appliqué à une UIView la propriété transform. Pour obtenir les effets dans coverflow, vous aurez à utiliser CATransform3D, qui sont appliquées dans l'espace 3-D, et donc peut vous donner le point de vue de la vue que vous souhaitez. Vous ne pouvez appliquer CATransform3Ds de couches, pas de points de vue, de sorte que vous allez avoir à passer à couches pour cela.

Découvrez le "CovertFlow" échantillon fourni avec Xcode. Mac uniquement (c'est à dire pas pour l'iPhone), mais beaucoup des concepts de transfert.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X