2009-07-10 15 views
26

C'è qualche problema nell'applicazione di più trasformazioni a un UIView ed è il corrispondente CALayer?Applicazione di più trasformazioni a un UIView/CALayer

In particolare, è possibile "combinare" CATransform3Ds con CGAffineTransforms senza incorrere in problemi?

Inoltre ci sono problemi con l'impostazione di alcune trasformazioni direttamente mentre si anima un altro cambio di trasformazione contemporaneamente?

Ci sono delle "regole" per come dovrebbe essere fatto, o qualche schema di progettazione per questo?

risposta

38

Mi rendo conto che questo non risponde completamente alla domanda (o si avvicina), ma se lavori solo con CGAffineTransforms puoi utilizzare CGAffineTransformConcat() per combinare più trasformazioni.

Questo funzionerà bene quando alcune trasformazioni sono animate e altre no, a patto di concatenare correttamente le trasformazioni. Non so come funzioni quando stai anche trasformando i livelli.

+1

'CGAffineTransformConcat' funziona bene per due trasformazioni ma è un po 'akward per tre o più. Vedi [questa risposta] (http://stackoverflow.com/questions/30929986/how-to-apply-multiple-transforms-in-swift/30929987#30929987) per fare più di due. – Suragch

31

pix0r ha ragione, ma ecco alcune informazioni in più su questo. The official docs for CGAffineTransformConcat().

Inoltre, ecco un breve esempio:

// Rotate 45 degrees 
CGAffineTransform rotate = CGAffineTransformMakeRotation(45*(M_PI/180)); 
// Move to the left 
CGAffineTransform translate = CGAffineTransformMakeTranslation(-50,0); 
// Apply them to a view 
self.view.transform = CGAffineTransformConcat(translate, rotate); 
+2

Non dovrebbe essere CGAffineTransformConcat (ruotare, tradurre), dato che i punti sono vettori di riga? – Plumenator

+0

Ho pensato la stessa cosa, ma sembra che il traduttore debba essere applicato per primo. Ruota attorno al centro del sistema di coordinate tradotto, ma se prima ruoti e poi traduci, la traslazione si trova lungo l'asse del sistema di coordinate ruotato. – gamozzii

-1

riesco a tradurre e ruotare un IMAGEVIEW nello stesso tempo, in questo modo:

float scaleFactor_x = 2.8; 
float scaleFactor_y = 2.45; 
imgBigBallBasic.frame = CGRectMake(112, 20, 100, 100); 
CGAffineTransform scaleTrans = CGAffineTransformMakeScale(scaleFactor_x, scaleFactor_y); 
CGAffineTransform translateTrans = CGAffineTransformMakeTranslation(0, 55); 
imgBigBallBasic.contentMode = UIViewContentModeScaleAspectFit; 
imgBigBallBasic.transform = CGAffineTransformConcat(translateTrans, scaleTrans); 
imgBigBallBasic.frame = CGRectMake(112, 20, 100, 100); 
imgBigBallBasic.center = [[imgBigBallBasic window] center]; 
[UIView commitAnimations]; 
1

sintassi è leggermente cambiata con Swift 3. Adattamento della risposta di @ whitehawk:

// Rotate 45 degrees 
var rotate = CGAffineTransform(rotationAngle: 45 * (.pi/180)) 
// Move to the left 
var translate = CGAffineTransform(translationX: -50, y: 0) 
// Apply them to a view 
self.view.transform = translate.concatenating(rotate) 
Problemi correlati