2010-12-07 7 views
5

Quiero crear una animación que mueva y gire una UIView al mismo tiempo. Yo probé el siguiente código:Movimiento animado y rotación de UIView no funciona

[UIView beginAnimations:@"MoveAndRotateAnimation" context:nil]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:kAnimationDuration]; 

myView.frame = newFrame; 
myView.transform = CGAffineTransformMakeRotation(0.4); 

[UIView commitAnimations]; 

El resultado es, que después de la animación ha terminado la vista se dibuja de forma incorrecta (algunas partes no son visibles más). Si solo cambio el marco O la transformación de la animación, la vista se dibuja correctamente. El problema solo ocurre si configuro tanto el fotograma como la transformación.

¿Cuál sería la forma correcta de animar el movimiento y la rotación de una vista al mismo tiempo?

+0

¿Dónde se define 'newFrame'? –

+0

Se define justo antes de la línea "beginAnimations": CGRect newFrame = CGRectMake (30,30,200,200); – kiteloop

Respuesta

8

No puede usar el marco, los límites o el centro si también está animando elementos como la rotación. Debe usar CGAffineTransforms para todo y concatenarlos juntos. Coméntalo así:

CGAffineTransform transform = CGAffineTransformMakeTranslation(100,100); 
transform = CGAffineTransformRotate(transform, 0.4); 

[UIView beginAnimations:@"MoveAndRotateAnimation" context:nil]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:kAnimationDuration]; 

myView.transform = transform; 

[UIView commitAnimations]; 
4

trata de hacerlo de esta manera: (moviendo hacia la izquierda y girando, sólo por ejemplo)

[UIView beginAnimations:@"MoveAndRotateAnimation" context:NULL]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:kAnimationDuration]; 

CGPoint center   = CGPointMake(-200, self.view.center.y); 
self.view.transform = CGAffineTransformMakeRotation(-0.5); 
self.view.center  = center; 

[UIView commitAnimations]; 

Las ubicaciones de los puntos de centro sería el punto que desea hacer la vista de movimiento, por supuesto.

0

El problema probablemente sea con su nuevo tamaño de fotograma en comparación con el tamaño de fotograma original. Ver marco es un poco complicado cuando gira un marco: Marco está en el sistema de coordenadas de superviews. Por lo tanto, cuando gira un rectángulo, el nuevo marco será el rectángulo más pequeño en el sistema de coordenadas de la supervista que contiene la vista. p. si tiene una vista cuadrada con un tamaño de fotograma de (100 * 100) y la gira 45 grados, su nuevo fotograma tendría un tamaño de (141 * 141) y si establece el fotograma para que tenga un tamaño de (100 * 100) cortarás parte de tu vista. Mire here para una mejor comprensión de cómo funciona el marco de visualización.

0

que tiene que hacer de esta manera ...

#pragma mark (Woblling animation) 
    CGAffineTransform leftWobble = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(-10.0)); 
    CGAffineTransform rightWobble = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(10.0)); 

    self.view .transform = leftWobble; // starting point 
    [UIView beginAnimations:@"wobble" context:self.view ]; 
    [UIView setAnimationRepeatAutoreverses:YES]; // important 
    [UIView setAnimationRepeatCount:11]; 
    [UIView setAnimationDuration:1.00]; 
    //[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(wobbleEnded:finished:context:)];//should be same as written 
    self.view .transform = rightWobble; // end here & auto-reverse 
    [UIView commitAnimations]; 

y luego poner en práctica estos métodos ... que son necesarios para mantener la vista en la misma posición después de la rotación.

- (void) wobbleEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{ 
    if ([finished boolValue]) { 
     UIView* item = (UIView *)context; 
     item.transform = CGAffineTransformIdentity; 
    } 
} 

Utilice este método si está utilizando la navegación y cuando se desplaza de una vista a otra, entonces su punto de vista sería al mismo place.else salir de este método:

- (void)viewWillAppear:(BOOL)animated 
{ 
    UIView* item = self.view; 
    item.transform = CGAffineTransformIdentity; 
} 

Hope esto sería ayudarte. Tuve el mismo problema pero hice algunos experimentos y llegué a esta solución. Si te ayuda, entonces no olvides votarme.

Cuestiones relacionadas