Comme l'a dit Ben, vous devrez travailler avec le UIView's
calque, en utilisant un CATransform3D
pour effectuer le layer's
rotation
. L'astuce pour faire fonctionner la perspective, comme décrit ici , est d'accéder directement à l'une des matrices cells
du CATransform3D
(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
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;
Swift 5.0
if let myView = self.subviews.first {
let layer = myView.layer
var rotationAndPerspectiveTransform = CATransform3DIdentity
rotationAndPerspectiveTransform.m34 = 1.0 / -500
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 45.0 * .pi / 180.0, 0.0, 1.0, 0.0)
layer.transform = rotationAndPerspectiveTransform
}
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 votre UIView'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 deux CALayers
contenus dans le même calque que je tourne.