2009-02-05 15 views
16

Estoy tratando de girar algunos UIView alrededor de su centro, por lo que el código simple es algo como (en pseudocódigo):girar una UIView alrededor de su centro, sino varias veces

[UIView beginAnimations:@"crazyRotate" context:nil]; 
[UIView setAnimationDuration:1.0]; 
someview.transform = CGAffineTransformMakeRotation(angle); 
[UIView commitAnimations] 

ahora si fijo el ángulo de Diga M_PI/2, la cosa gira muy bien. si lo configuro en 2 * M_PI, bien, no hace "nada". Puedo entender que la matriz se traduce en algo que no hace nada (rotar 360 significa "permanecer" en cierto sentido), , pero quiero rotarlo 5 veces (piense en una escala rotativa de periódico que se acerca a usted efecto - estoy no es bueno para describir, espero que alguien entienda). Por lo tanto, traté de agregar el ángulo de configuración a 180 grados (M_PI) y agregar un animatationBlock anidado. , pero supongo que ya que estoy configurando la misma propiedad (someview.transition) nuevamente lo ignora de alguna manera). He intentado configurar el conteo de repetición de la animación en 2 con el ángulo M_PI, pero parece que simplemente gira 180, volviendo a la posición recta y luego iniciando la rotación de nuevo.

Por lo tanto, estoy un poco fuera de las ideas, cualquier ayuda apreciada! --t

+0

también puede iniciar aquí: https://github.com/jonasschnelli/UIView-i7Rotate360 muy fácil de implementar y cambiar. –

+0

posible duplicado de [Animación de rotación UIView Infinite 360 ​​degree?] (Http://stackoverflow.com/questions/9844925/uiview-infinite-360-degree-rotation-animation) –

Respuesta

36

Puede usar la siguiente animación en la propiedad de capa de su UIView. Lo he probado

UIView *viewToSpin = ...;  
CABasicAnimation* spinAnimation = [CABasicAnimation 
            animationWithKeyPath:@"transform.rotation"]; 
spinAnimation.toValue = [NSNumber numberWithFloat:5*2*M_PI]; 
[viewToSpin.layer addAnimation:spinAnimation forKey:@"spinAnimation"]; 
+0

¿Cómo puedo ralentizar esta animación? – mahboudz

+0

Para consideraciones sobre el tiempo de animación, consulte el material de referencia para el protocolo CAMediaTiming, que CABasicAnimation implementa. En particular, es probable que desee establecer la propiedad 'duración'. El código anterior usa la duración predeterminada de 0,25 segundos. –

1

conseguir un efecto de giro continuo es un poco complicado, pero describen un medio para hacerlo here. Sí, Core Animation parece optimizar las transformaciones a la posición final más cercana dentro del círculo unitario. El método que describo allí encadena unas pocas animaciones de media rotación para hacer rotaciones completas, aunque se nota un ligero tartamudeo en el traspaso de una animación a la siguiente.

Quizás una CAKeyframeAnimation construida con estos valores de media rotación sería el camino correcto a seguir. Entonces también puedes controlar la aceleración y la desaceleración.

6

Como lo indicó Brad Larson, puede hacer esto con un CAKeyframeAnimation. Por ejemplo,

CAKeyframeAnimation *rotationAnimation; 
rotationAnimation = 
    [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"]; 

rotationAnimation.values = [NSArray arrayWithObjects: 
          [NSNumber numberWithFloat:0.0 * M_PI], 
          [NSNumber numberWithFloat:0.75 * M_PI], 
          [NSNumber numberWithFloat:1.5 * M_PI], 
          [NSNumber numberWithFloat:2.0 * M_PI], nil]; 
rotationAnimation.calculationMode = kCAAnimationPaced; 
rotationAnimation.removedOnCompletion = NO; 
rotationAnimation.fillMode = kCAFillModeForwards; 
rotationAnimation.timingFunction = 
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
rotationAnimation.duration = 10.0; 

CALayer *layer = [viewToSpin layer]; 
[layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 

Se puede controlar la duración de la animación total, con la propiedad rotationAnimation.duration, y la aceleración y desaceleración (y cálculo de los pasos intermedios) con la propiedad rotationAnimation.timingFunction.

1
CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
animation.fromValue = [NSNumber numberWithFloat:0.0f]; 
animation.toValue = [NSNumber numberWithFloat: 2*M_PI]; 
animation.duration = 8.0f; 
animation.repeatCount = INFINITY; 
[self.myView.layer addAnimation:animation forKey:@"SpinAnimation"]; 
Cuestiones relacionadas