Come gestire una matrice di traduzione in un punto di vista dell'asse Y invertito
-
03-07-2019 - |
Domanda
My usercase è un'applicazione per iPhone in cui eseguo un'animazione sulla scala, sulla rotazione e sulla traduzione di un'immagine.
Quindi concedo tutto e lo invio alla proprietà transform, ma c'è un problema:
Poiché le mie immagini hanno dimensioni variabili, è un problema posizionarle correttamente. Sono abituato a un sistema di coordinate dell'asse y invertito, quindi voglio che la mia immagine sia posizionata esattamente a 60 pixel nell'asse y.
Quindi, come posso passare dall'asse y cartesiano originale a un punto di vista dell'asse y invertito?
Soluzione
Come smacl sottolinea, il modo più semplice per farlo è spostare la tua origine nella parte inferiore sinistra dello schermo usando (screenheight - viewheight - y) invece di y nelle origini delle tue viste.
Tuttavia, puoi capovolgere il sistema di coordinate dei livelli della vista principale usando un CATransform3D. Faccio questo in modo da poter condividere lo stesso codice di layout CALayer Core Animation tra la mia applicazione iPhone e un client Mac (l'iPhone inverte il normale sistema di coordinate Quartz per i CALayer in modo che corrisponda a quello delle UIVview). Tutto ciò che devi fare per abilitare questo è posizionare la linea
self.layer.sublayerTransform = CATransform3DMakeScale(1.0f, -1.0f, 1.0f);
nel tuo codice di inizializzazione per la tua UIView di hosting di layer. Ricorda che questo capovolgerà i tuoi CALayer, quindi potrebbe essere necessario capovolgere qualsiasi rendering di testo UIKit in quei livelli usando un codice simile al seguente:
CGContextSaveGState(context);
CGContextTranslateCTM(context, 0.0f, self.frame.size.height);
CGContextScaleCTM(context, 1.0f, -1.0f);
UIFont *theFont = [UIFont fontWithName:@"Helvetica" size:fontSize];
[text drawAtPoint:CGPointZero withFont:theFont];
CGContextRestoreGState(context);
Puoi fare una sorta di inversione simile usando una CGAffineTransform, ma dovrai anche applicare una traduzione per farlo funzionare:
CGAffineTransform flipTransform = CGAffineTransformMakeTranslation(0.0f, self.frame.size.height);
flipTransform = CGAffineTransformScale(flipTransform, 1.0f, -1.0f);
Potresti essere in grado di utilizzare la trasformazione affine per convertire le coordinate di origine utilizzando CGPointApplyAffineTransform ().
Altri suggerimenti
Per ogni ordinata y, y = top-y, dove top è l'ordinata y della parte superiore del rettangolo di selezione in cui si sta disegnando.