2012-11-08 32 views
2

重複旋轉在我的iPhone應用程序我有180度旋轉進入視野時,再次單擊該按鈕旋轉再180度回到它開始時,另一種的UIButton被按下,則一個UIButton。CAKeyframeAnimation從最後一點

這一切在第一次完整的360度過程發生時都能正常工作,但如果我嘗試從頭再次開始,它會捕捉180度,然後嘗試從該點旋轉它。任何人都可以將我指向正確的方向嗎?這裏是我到目前爲止的代碼...

showAnimation= [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"]; 
        showAnimation.duration = self.showAnimationDuration; 
        showAnimation.repeatCount = 1; 
        showAnimation.fillMode = kCAFillModeForwards; 
        showAnimation.removedOnCompletion = NO; 
        showAnimation.cumulative = YES; 
        showAnimation.delegate = self; 

float currentAngle =[[[rotateMe.layer presentationLayer] valueForKeyPath:@"transform.rotation.z"] floatValue]; 

//Rotate 180 degrees from current rotation 
showAnimation.values = [NSArray arrayWithObjects:  
         [NSNumber numberWithFloat:currentAngle], 
         [NSNumber numberWithFloat:currentAngle + (0.5 * M_PI)], 
         [NSNumber numberWithFloat:currentAngle + M_PI], nil]; 

[rotateMe.layer addAnimation:showAnimation forKey:@"show"]; 

上的動畫,使之成爲可用的I然後更新rotateMe.transform旋轉層的旋轉完成。

- (void)animationDidStop:(CAKeyframeAnimation *)anim finished:(BOOL)flag 
{ 
    float currentAngle =[[[self.layer presentationLayer] valueForKeyPath:@"transform.rotation.z"] floatValue]; 

    NSLog(@"End: %f", currentAngle); 
    rotateMe.transform = CGAffineTransformMakeRotation(0); 
} 

我已經實現了與

[UIView animateWithDuration:1.0f] 
     animations:^{ 
      CGAffineTransform transform = CGAffineTransformRotate(rotateMe.transform, DEGREES_TO_RADIANS(179.999f)); 
      rotateMe.transform = transform; 
     } 
    ]; 

全工作的效果,但我想使動畫更加複雜,因此CAKeyframeAnimation。

回答

5

你可以動畫配置是additive,如果你需要的所有關鍵幀從0到180度的動畫。如果你並不需要不同的關鍵幀,你可以簡單地用基本的動畫和byValue財產做。下一次添加動畫時,它會旋轉180度以上的視角。

如果您在委託回調中設置實際值,則不需要填充模式,並且不需要在完成時刪除動畫。

CABasicAnimation *showAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
showAnimation.byValue = M_PI; 
showAnimation.duration = self.showAnimationDuration; 
showAnimation.delegate = self; 

[rotateMe.layer addAnimation:showAnimation forKey:@"show"]; 

或使用關鍵幀動畫(如上所述:使它在0到180度之間添加和生成動畫)。

CAKeyframeAnimation *showAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"]; 
showAnimation.additive = YES; // Make the values relative to the current value 
showAnimation.values = @[0, /*all your intermediate values here... ,*/ M_PI]; 
showAnimation.duration = self.showAnimationDuration; 
showAnimation.delegate = self; 

[rotateMe.layer addAnimation:showAnimation forKey:@"show"]; 
+0

謝謝!這確實工作正常,雖然作爲一個委員會的問題,我想找到我在關鍵幀版本中做錯了什麼。你有沒有關於如何將上述內容寫成關鍵幀版本的例子? – Jaaaaaay

+0

你會做,就像我解釋說:「配置動畫是添加劑和0〜180度的動畫」。我已將關鍵幀動畫代碼添加到我的答案中。 –

+0

好的非常感謝!我會標記爲已回答。 – Jaaaaaay