2012-04-08 48 views
7

我的CABasicAnimation存在一些問題。它類似於該帖子:CABasicAnimation rotate returns to original positionCABasicAnimation如何獲取當前的旋轉角度

所以,我有uiimageview在touchMove中旋轉。在touchEnd調用方法做「的動畫慣性」:

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

這部動畫工作正常,但如果我調用touchBegan animationRotation結束前,旋轉角度爲beginValue。我需要陰極電流旋轉角度。作爲一個實驗,我宣佈方法

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

和它似乎工作。但我不知道如何在animationDidStop中爲我的UIImageView獲取角度值或CGAffineTransform值。 這甚至有可能嗎?謝謝。

回答

9

您應該使用presentationLayer方法在飛行動畫期間獲取圖層屬性。

使你的代碼應該是這樣的,

#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

謝謝,我想這一點,它的工作原理,但並不完全,因爲它應該。我用NSTimer動畫..但無論如何感謝:-) – frankWhite 2012-04-30 17:52:01

+0

Upvoted獲取圖層的當前可見旋轉的方法。 – geraldWilliam 2016-09-29 22:28:09