2012-04-08 11 views
7

Tengo algún problema con CABasicAnimation. Es similar a esa publicación: CABasicAnimation rotate returns to original positionCABasicAnimation cómo obtener el ángulo de rotación actual

Por lo tanto, tengo uiimageview que gira en touchMove. En touchEnd invocar el método que sí lo hacen "animación de inercia":

-(void)animationRotation: (float)beginValue 
{ 
    CABasicAnimation *anim; 
    anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; 
    anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
    anim.duration = 0.5; 
    anim.repeatCount = 1; 

    anim.fillMode = kCAFillModeForwards; 
    anim.fromValue = [NSNumber numberWithFloat:beginValue]; 
    [anim setDelegate:self];  

    anim.toValue = [NSNumber numberWithFloat:(360*M_PI/180 + beginValue)]; 
    [appleView.layer addAnimation:anim forKey:@"transform"]; 

    CGAffineTransform rot = CGAffineTransformMakeRotation(360*M_PI/180 + beginValue); 
    appleView.transform = rot; 
} 

Esta animación trabaja muy bien, pero si invoco touchBegan antes animationRotation terminó, el ángulo de rotación es BeginValue. Necesito el ángulo de rotación actual de Cath. Como experimento, declaro el método

-(vod) animationDidStop:(CAAnimation *)anim finished:(BOOL)flag 
{ 
     NSLog(@"Animation finished!"); 
} 

y parece funcionar. pero no sé cómo obtener ese valor de ángulo o CGAffineTransform para mi UIImageView en animationDidStop. ¿Es posible? Gracias.

Respuesta

9

debe usar el método presentationLayer para obtener propiedades de capa durante la animación en vuelo.

lo que el código debería ser así,

#define RADIANS_TO_DEGREES(__ANGLE__) ((__ANGLE__)/(float)M_PI * 180.0f) 

    -(void)animationRotation: (float)beginValue 
    { 
     CABasicAnimation *anim; 
     anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
     anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
     anim.duration = 0.5; 
     anim.repeatCount = 1; 

     anim.fillMode = kCAFillModeForwards; 
     anim.fromValue = [NSNumber numberWithFloat:beginValue]; 
     [anim setDelegate:self];  



    //get current layer angle during animation in flight 
     CALayer *currentLayer = (CALayer *)[appleView.layer presentationLayer];  
     float currentAngle = [(NSNumber *)[currentLayer valueForKeyPath:@"transform.rotation.z"] floatValue]; 
     currentAngle = roundf(RADIANS_TO_DEGREES(currentAngle));   

     NSLog(@"current angle: %f",currentAngle); 



     anim.toValue = [NSNumber numberWithFloat:(360*M_PI/180 + beginValue)]; 
     [appleView.layer addAnimation:anim forKey:@"transform"]; 

     CGAffineTransform rot = CGAffineTransformMakeRotation(360*M_PI/180 + beginValue); 
     appleView.transform = rot; 
    } 
+0

Gracias, he intentado esto, funciona, pero no es como debiera. Usé la animación NSTimer ... pero gracias de todos modos :-) – frankWhite

+0

Upvoted para el método de obtención de la rotación actualmente visible de la capa. – geraldWilliam

Cuestiones relacionadas