2009-07-10 18 views
26

¿Hay algún problema al aplicar múltiples transformaciones a un UIView y su correspondiente CALayer?Aplicar múltiples transformaciones a un UIView/CALayer

Específicamente, ¿puede "mezclar y combinar" CATransform3Ds con CGAffineTransforms sin tener problemas?

¿También hay algún problema al configurar algunas transformaciones directamente mientras se anima otro cambio de transformación simultáneamente?

¿Hay alguna "regla" sobre cómo se debe hacer esto, o algún patrón de diseño para esto?

Respuesta

38

Me doy cuenta de que esto no responde la pregunta del todo (o se acerca), pero si solo está trabajando con CGAffineTransforms puede usar CGAffineTransformConcat() para combinar múltiples transformaciones.

Esto funcionará bien cuando algunas transformaciones están animadas y otras no, siempre que concat la transformación correctamente. No sé cómo funciona esto cuando también estás haciendo transformaciones de capa.

+1

'CGAffineTransformConcat' funciona bien para dos transformaciones pero es un poco incómodo por tres o más. Ver [esta respuesta] (http://stackoverflow.com/questions/30929986/how-to-apply-multiple-transforms-in-swift/30929987#30929987) para hacer más de dos. – Suragch

31

pix0r es correcto, pero aquí hay algo más de información sobre esto. The official docs for CGAffineTransformConcat().

Además, aquí es un ejemplo rápido:

// 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

¿No debería ser CGAffineTransformConcat (rotar, traducir), dado que los puntos son vectores de fila? – Plumenator

+0

Pensé lo mismo, pero parece que el traductor debería aplicarse primero. Girar se encuentra alrededor del centro del sistema de coordenadas traducido, pero si gira primero y luego traduce, el traslado se realiza a lo largo del eje del sistema de coordenadas girado. – gamozzii

-1

lo consigo para traducir y girar una imageView en el mismo tiempo, de esta manera:

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

Sintaxis ha cambiado ligeramente con Swift 3. Adaptación de la respuesta de @ 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) 
Cuestiones relacionadas