Comment appliquer une transformation de perspective à un UIView?

Je cherche à effectuer une transformation de perspective sur un UIView (comme vu dans coverflow)

Est-ce que quelqu'un sait si c'est possible?

J'ai enquêté en utilisant CALayer et j'ai parcouru tous les podcasts pragmatiques 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.

Toute aide, pointeur ou exemple d'extrait de code serait vraiment apprécié!

    Comme Ben l'a dit, vous devrez travailler avec la couche de UIView, en utilisant un CATransform3D pour effectuer la rotation du calque. L'astuce pour get une perspective de travail, comme décrit ici , est d'accéder directement à l'une des cellules masortingcielles de la CATransform3D (m34). Les mathématiques masortingcielles n'ont jamais été mon truc, donc je ne peux pas expliquer exactement pourquoi cela fonctionne, mais c'est le cas. Vous devez définir cette valeur sur une fraction négative pour votre transformation initiale, puis appliquer les transformations de rotation de couche à cette valeur. Vous devriez également être capable de faire ce qui suit:

     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 transformation de couche à partir de zéro pour chaque rotation.

    Un exemple complet de ceci (avec le code) peut être trouvé ici , où j'ai mis en application la rotation basée sur le contact et la mise à l'échelle sur un couple de CALayers, basé sur un exemple par Bill Dudney. La dernière version du programme, tout en bas de la page, implémente ce type d'opération en perspective. Le code devrait être raisonnablement simple à lire.

    La sous-couche Transformation dont vous parlez dans votre réponse est une transformation qui est appliquée aux sous-couches de CALayer de votre CALayer . Si vous n'avez pas de sous-couches, ne vous inquiétez pas. J'utilise le sous-layerTransform dans mon exemple simplement parce qu'il y a deux CALayers contenus dans la couche que je suis en train de tourner.

    Un très, très bon article sur la transformation et la perspective 3D de CALayer, incluant une explication complète du champ m34, peut être trouvé dans cet excellent article:

    core-animation-3d-model

    Vous ne pouvez utiliser que des transformations Core Graphics (Quartz, 2D uniquement) directement appliquées à la propriété transform d'UIView. Pour get les effets dans Coverflow, vous devrez utiliser CATransform3D, qui sont appliqués dans l'espace 3D, et ainsi vous donner la vue en perspective que vous voulez. Vous pouvez uniquement appliquer CATransform3Ds à des calques, pas à des vues, vous devrez donc passer à des calques pour cela.

    Découvrez l'exemple "CovertFlow" fourni avec Xcode. C'est mac-seulement (pas pour iPhone), mais beaucoup de concepts sont bien transférés.

    Pour append à la réponse de Brad et donner un exemple concret, j'emprunte ma propre réponse dans un autre article sur un sujet similaire. Dans ma réponse, j'ai créé un terrain de jeu Swift simple que vous pouvez download et jouer , où je montre comment créer des effets de perspective d'un UIView avec une simple hiérarchie de couches, et je montre des résultats différents entre l'utilisation de transform et sublayerTransform . Vérifiez-le.

    Voici quelques images du post:

    Option .sublayerTransform

    option .transform