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 cherché à utiliser CALayer
et à parcourir tous les podcasts pragmatiques de Core Animation, mais je ne sais toujours pas comment créer ce type de transformation sur un iPhone.
Toute aide, pointeur ou exemple d'extrait de code serait vraiment apprécié!
ios
cocoa-touch
uiview
core-animation
calayer
Nick Cartwright
la source
la source
Réponses:
Comme l'a dit Ben, vous devrez travailler avec le
UIView's
calque, en utilisant unCATransform3D
pour effectuer lelayer's
rotation
. L'astuce pour faire fonctionner la perspective, comme décrit ici , est d'accéder directement à l'une des matricescells
duCATransform3D
(m34). Les mathématiques matricielles n'ont jamais été mon truc, donc je ne peux pas expliquer exactement pourquoi cela fonctionne, mais ça marche. Vous devrez définir cette valeur sur une fraction négative pour votre transformation initiale, puis appliquer vos transformations de rotation de calque à cela. Vous devriez également pouvoir effectuer les opérations suivantes:Objectif c
Swift 5.0
qui reconstruit la transformation de calque à partir de zéro pour chaque rotation.
Un exemple complet de ceci (avec code) peut être trouvé ici , où j'ai implémenté une rotation tactile et une mise à l'échelle sur quelques-uns
CALayers
, sur la base d'un exemple de Bill Dudney. La dernière version du programme, tout en bas de la page, implémente ce type d'opération de perspective. Le code doit être assez simple à lire.Le
sublayerTransform
auquel vous faites référence dans votre réponse est une transformation qui est appliquée aux sous-couches de votreUIView's
CALayer
. Si vous n'avez pas de sous-couches, ne vous en faites pas. J'utilise le sublayerTransform dans mon exemple simplement parce qu'il y en a deuxCALayers
contenus dans le même calque que je tourne.la source
Vous ne pouvez utiliser que les transformations Core Graphics (Quartz, 2D uniquement) directement appliquées à la propriété de transformation d'UIView. Pour obtenir les effets dans le coverflow, vous devrez utiliser CATransform3D, qui sont appliqués dans l'espace 3D, et peuvent donc vous donner la vue en perspective que vous souhaitez. Vous ne pouvez appliquer CATransform3D qu'aux calques, pas aux vues, vous devrez donc passer aux calques pour cela.
Découvrez l'exemple "CovertFlow" fourni avec Xcode. C'est uniquement pour mac (c'est-à-dire pas pour iPhone), mais beaucoup de concepts se transfèrent bien.
la source
Pour compléter la réponse de Brad et fournir 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 simple terrain de jeu Swift que vous pouvez télécharger et jouer avec , où je montre comment créer des effets de perspective d'une UIView avec une hiérarchie simple de couches, et je montre des résultats différents entre l'utilisation
transform
etsublayerTransform
. Vérifiez-le.Voici quelques images du post:
la source
Vous pouvez obtenir un effet carrousel précis à l'aide du SDK iCarousel.
Vous pouvez obtenir un effet de flux de couverture instantané sur iOS en utilisant la merveilleuse et gratuite bibliothèque iCarousel. Vous pouvez le télécharger sur https://github.com/nicklockwood/iCarousel et le déposer dans votre projet Xcode assez facilement en ajoutant un en-tête de pontage (il est écrit en Objective-C).
Si vous n'avez pas ajouté de code Objective-C à un projet Swift auparavant, procédez comme suit:
Exemple de code Swift 3:
la source