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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top