Come ha detto Ben, dovrai lavorare con il UIView's
livello, usando a CATransform3D
per eseguire il layer's
rotation
. Il trucco per far funzionare la prospettiva, come descritto qui , è accedere direttamente a una delle matrici cells
di CATransform3D
(m34). La matematica Matrix non è mai stata la mia cosa, quindi non posso spiegare esattamente perché questo funziona, ma lo fa. Dovrai impostare questo valore su una frazione negativa per la tua trasformazione iniziale, quindi applicare le trasformazioni di rotazione del livello a quella. Dovresti anche essere in grado di fare quanto segue:
Objective-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
}
che ricostruisce la trasformazione del livello da zero per ogni rotazione.
Un esempio completo di questo (con codice) può essere trovato qui , dove ho implementato la rotazione basata sul tocco e il ridimensionamento su un paio di CALayers
, sulla base di un esempio di Bill Dudney. La versione più recente del programma, in fondo alla pagina, implementa questo tipo di operazione prospettica. Il codice dovrebbe essere ragionevolmente semplice da leggere.
Il sublayerTransform
riferimento a cui fai riferimento nella tua risposta è una trasformazione che viene applicata ai tuoi sublayer UIView's
CALayer
. Se non hai sublayer, non preoccuparti. Uso il sublayerTransform nel mio esempio semplicemente perché ci sono due CALayers
contenuti all'interno di uno strato che sto ruotando.