2011-10-07 18 views
6

Quería rotar una UIView en su eje horizontal para 360 grados y luego actualizar el contenido en la vista. Estaba buscando soluciones en esto. Encontré una pareja aquí n allí. Esto es con lo que salí.Girar una UIView en su eje X (eje horizontal)

[UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionTransitionNone animations:^{ 
     self.tableView.layer.transform = CATransform3DMakeRotation(M_PI,1.0,0.0,0.0); 
    } completion:^(BOOL finished){ 
     NSLog(@"Finished first pi"); 
     [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionTransitionNone animations:^{ 
      self.tableView.layer.transform = CATransform3DMakeRotation(M_PI,1.0,0.0,0.0); 
     } completion:^(BOOL finished) { 
      NSLog(@"Finished second pi"); 

     }];   

    }]; 

Esto voltea la vista pero solo en 180 grados. Quiero que se voltee una vez más para que pueda ver la vista normalmente ...

Ambos mis NSLogs se muestran uno después del otro. Estoy seguro de que me falta algo aquí. Cualquier ayuda sería muy útil ..

Gracias

Respuesta

8

En su bloque de finalización intente concatenar la nueva transformación con la transformación actual.

self.tableView.layer.transform = CATransform3DConcat(self.tableView.layer.transform, CATransform3DMakeRotation(M_PI,1.0,0.0,0.0)); 
+1

No es necesario para establecer la '' transform' en el CALayer' directamente en este caso, sólo tiene que establecer la '' transform' en el UIView', aunque es un tipo diferente de 'struct' - un' CGAffineTransform'. –

+0

Eso es correcto. Solo quería irme del ejemplo dado. Siempre uso la transformación en UIView. – jaminguy

1

Usted debe verificar esta respuesta How to make a CATransform3dMakeRotation rotate the other way? And chain together

creo que su problema está relacionado con: "Cuando se está trabajando con una transformación directa, Core Animation se interpolar la Transfiera del valor actual a la transformada especificada. Encontrará la ruta más corta para llegar a esa transformación, lo que restringirá la dirección de la animación. Si intenta animar la misma propiedad de transformación dos veces, el segundo valor simplemente anulará la primera, no combina las dos transformaciones juntas ".

1

uso esto: -

rotatingView.layer.anchorPoint = CGPointMake(0.0f, 0.0f); 
    rotatingView.center = CGPointMake(0, 
             (rotatingView.center.y - 
             (rotatingView.bounds.size.height/2.0f))); 
    rotatingView.center = CGPointMake(0, 
             (rotatingView.center.y- 
             (rotatingView.bounds.size.height/2))); 

// start the Page Open 
[UIView beginAnimations:@"Animation" context:nil]; 
[UIView setAnimationDuration:13.0]; 
// set angle as per requirement 
[rotatingView.layer setValue:[NSNumber numberWithInt:280] 
        forKeyPath:@"transform.rotation.x"]; 

[UIView commitAnimations]; 
0

Sólo tiene que cambiar su CÓDIGO de 1.0 a 0.0 en el interior del bloque terminación y woohoo todo hecho.

[UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionTransitionNone animations:^{ 
      self.tableView.layer.transform = CATransform3DMakeRotation(M_PI,1.0,0.0,0.0); 
     } completion:^(BOOL finished){ 
      NSLog(@"Finished first pi"); 
      [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionTransitionNone animations:^{ 
       self.tableView.layer.transform = CATransform3DMakeRotation(M_PI,0.0,0.0,0.0); 
      } completion:^(BOOL finished) { 
       NSLog(@"Finished second pi"); 

      }];   

     }]; 
0

También puede acercarse a este número de repeticiones usando el .Repeat y .Autoreverse opciones de animación + configuración de la animación. He aquí un ejemplo en Swift:

UIView.animateWithDuration(time, delay: 0, options: [.Repeat, .Autoreverse], animations: { 
     UIView.setAnimationRepeatCount(3) 
     self.view.layer.transform = CATransform3DMakeRotation(CGFloat(M_PI), 1, 0, 0) 
    }) { (completed) in 
     // completion 
    } 
Cuestiones relacionadas