2012-04-08 19 views
7

Mam pewien problem z CABasicAnimation. Jest podobny do tego posta: CABasicAnimation rotate returns to original positionCABasicAnimation jak uzyskać bieżący kąt obrotu

Mam więc uiimageview, który obracam w touchMove. W touchEnd wywołać metodę, która nie „animacja bezwładności”:

-(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; 
} 

Animacja ta działa dobrze, ale jeśli modlę touchBegan przed animationRotation skończyło, kąt obrotu jest beginValue. Potrzebuję kąt obrotu prądu cath. W ramach eksperymentu deklaruję metodę i wydaje się, że ta metoda działa. ale nie wiem, jak uzyskać tę wartość kąta lub CGAffineTransform dla mojego UIImageView w animationDidStop. Można to nawet zrobić? Dzięki.

Odpowiedz

9

należy użyć metody presentationLayer, aby uzyskać właściwości warstw podczas animacji podczas lotu.

więc kod powinien być taki,

#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

Dzięki, próbowałem to, to działa, ale nie tak jak powinno. Użyłem animacji NSTimer .. ale dzięki i tak :-) – frankWhite

+0

Rewizja dla metody uzyskiwania aktualnie widocznej rotacji warstwy. – geraldWilliam

Powiązane problemy