Este debe ser simple, pero estoy teniendo problemas para la rotación de un UIImageView un total de 360 grados, que se repite siempre.

[UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveLinear | UIViewAnimationOptionBeginFromCurrentState animations:^{
    self.reloadButton.imageView.transform = CGAffineTransformRotate(self.reloadButton.imageView.transform, -M_PI);
} completion:^(BOOL finished) {

}];

De acuerdo a la documentación, la signedness del ángulo a que pase a CGAffineTransformRotate determina la dirección de la rotación, pero el código anterior gira en sentido antihorario. Mismo con M_PI.

El ángulo, en radianes, por lo que este tipo de matriz se gira la coordenada
sistema de ejes. En iOS, un valor positivo especifica en sentido antihorario
la rotación y un valor negativo especifica rotación en sentido horario. En Mac OS
X, un valor positivo especifica de rotación en sentido horario y un valor negativo
especifica la rotación en sentido antihorario.

¿Qué sucede si la rotación en el imageViews capa con un CATransform3D?
¿pruebe a girar por otros ángulos (es decir 180 grados) ?
Gracias por la sugerencia, pero esto produjo los mismos resultados: auto.reloadButton.imageView.la capa.transformar = CATransform3DMakeRotation(-M_PI, 0, 0, 1);
Desde M_PI es de 180 grados debe ser el mismo. ¿qué sucede si usted girar mi M_PI/4 o -M_PI/4? Usted debe ver alguna diferencia?

OriginalEl autor Morrowless | 2012-05-08

4 Comentarios

  1. 14

    Christoph ya está pasando de la manera correcta, pero hay una mucho mejor manera de mantener girando sin reinvoke en la animación de los delegados, cada vez que se termina. Esto es simplemente incorrecto.

    Acaba de establecer el repeatCount propiedad de la animación a HUGE_VALF.

    CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    animation.fromValue = @0.0f;
    animation.toValue = @(2*M_PI);
    animation.duration = 0.5f;             //this might be too fast
    animation.repeatCount = HUGE_VALF;     //HUGE_VALF is defined in math.h so import it
    [self.reloadButton.imageView.layer addAnimation:animation forKey:@"rotation"];

    Como se indica en la documentación, esto hará que la animación se repita siempre.

    Ok, en realidad no pensar en ello, porque 270 grados fueron suficientes para mí. Ajuste el número de repeticiones es mucho mejor, voy a cambiar en consecuencia.
    Gracias por el código! funciona muy bien
    Sólo uso CGFLOAT_MAX en lugar de importar algo.
    O directamente escribir 1e50f ya que es todo lo mismo… O lo hacemos como la documentación de los estados.
    en realidad, el docs decirle específicamente para uso HUGE_VALF. developer.apple.com/library/mac/documentation/GraphicsImaging/…

    OriginalEl autor yinkou

  2. 1

    Lo siento perdiste la primera parte, a la vista de gira bien el uso de ángulo más pequeño:

    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveLinear | UIViewAnimationOptionBeginFromCurrentState animations:^{
            redView.transform = CGAffineTransformRotate(redView.transform, M_PI_2);
        } completion:^(BOOL finished) {
    
        }];

    No pude encontrar nada significativo explicaciones de por qué no funciona con M_PI.

    La repetición es exactamente lo que quiero, el problema es que no es de rotación de las agujas del reloj.
    Creo que es porque el estado final de la rotación es el mismo que el original del estado de

    OriginalEl autor mit3z

  3. 1

    Tuve el mismo problema hace un tiempo.
    No recuerdo la razón para ese problema, pero esta es mi solución:

    /**
     * Incrementally rotated the arrow view by a given angle.
     *
     * @param degrees Angle in degrees.
     * @param duration Duration of the rotation animation.
     */
    - (void)rotateArrowViewByAngle:(CGFloat)degrees
                      withDuration:(NSTimeInterval)duration {
    
        CABasicAnimation *spinAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
        spinAnimation.fromValue = [NSNumber numberWithFloat:self.currentAngle / 180.0 * M_PI];
        spinAnimation.toValue = [NSNumber numberWithFloat:degrees / 180.0 * M_PI];
        spinAnimation.duration = duration;
        spinAnimation.cumulative = YES;
        spinAnimation.additive = YES;
        spinAnimation.removedOnCompletion = NO;
        spinAnimation.delegate = self;
        spinAnimation.fillMode = kCAFillModeForwards;
    
        [self.arrowView.layer addAnimation:spinAnimation forKey:@"spinAnimation"];
    
        self.currentAngle = degrees;
    }

    y, a continuación, puede utilizar los métodos de delegado

    - (void)animationDidStart:(CAAnimation *)theAnimation
    - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag

    para girar mantenerlo girando.
    También, el grado y la duración de los parámetros puede ser muy alta los números… si esto es suficiente.

    ACTUALIZACIÓN:

    Como dijo yinkou,

    spinAnimation.repeatCount = HUGE_VALF;     //HUGE_VALF is defined in math.h so import it 

    es mucho mejor que reiniciar la animación en el delegado.

    TENGA EN CUENTA:

    auto.currentAngle es una propiedad recordar que el actual final de la rotación.

    Necesitaba que hacer de la vista de girar a la izquierda y a la derecha el camino alrededor.

    OriginalEl autor Christoph

Dejar respuesta

Please enter your comment!
Please enter your name here