ios objective-c cocoa-touch uiview cgaffinetransform

ios - rotar una UIView alrededor de su centro, pero varias veces



objective-c cocoa-touch (4)

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"];

Estoy tratando de rotar algunos UIView alrededor de su centro, por lo que el código simple es algo así como (en pseudocódigo):

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

ahora si configuro un ángulo para decir 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 a algo que no hace nada (rotar 360 significa "permanecer" en cierto sentido), sin embargo, quiero rotarlo 5 veces (piense en una escala de rotación de periódico que se acerca a usted efecto - No estoy genial 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 ) otra vez lo ignora de alguna manera). Intenté 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 nuevamente.

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


Como indicó Brad Larson, puede hacer esto con una 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"];

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


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"];


Obtener un efecto de giro continuo es un poco complicado, pero describo un medio para hacerlo aquí . 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.