2014-02-13 74 views
0

我想執行一個無限360度旋轉動畫,所以編碼:CATransaction旋轉層360度奇怪

- (void)rotate 
{ 
    __weak typeof(self) weakSelf = self; 

    [CATransaction begin]; 
    [CATransaction setDisableActions:NO]; 
    [CATransaction setCompletionBlock:^{ 
     [weakSelf rotate]; 
    }]; 
    [CATransaction setAnimationDuration:1.0]; 
    [CATransaction setAnimationTimingFunction: 
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
    self.squareLayer.transform = CATransform3DRotate(self.squareLayer.transform, M_PI, 0, 0, 1); 
    [CATransaction commit]; 
} 

M_PI裝置180度,所以相信層可以由0M_PI * 1M_PI * 2旋轉...

但它原來是從0M_PI,然後M_PI0的旋轉。

我可以使它通過CABasicAnimation

CABasicAnimation *animatin = [CABasicAnimation animationWithKeyPath:@"transform"]; 
animatin.duration = 1.0; 
animatin.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(0, 0, 0, 1)]; 
animatin.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 0, 0, 1)]; 
animatin.repeatCount = HUGE_VALF; 
animatin.fillMode = kCAFillModeForwards; 
[self.squareLayer addAnimation:animatin forKey:@"a"]; 

代碼以上360度完全旋轉層。

但是我對第一個實現感到困惑,爲什麼它會變得如此奇怪?

+0

'rotate'的實現是什麼?它是否一次又一次地自我調用? –

+0

是的,它每次都以當前的變換輪換M_PI。 – Bzmario

回答

2

這是一個邊緣案例。用隱式動畫,你不能說「順時針旋轉這個數量」。你只是在說「將變換設置爲這個值,併爲其生成動畫效果。」那麼,這種變化應該如何動畫呢?運行時必須提供一個答案,而且不知道如何做到這一點。由M_PI進行的旋轉變換在兩個方向上都是相同的「距離」,所以它構成的答案是任意的。如果您提供的值爲M_PI+0.1而值爲M_PI-0.1,則可以更清楚地看到問題;你實際上會得到相反的結果:一個繼續順時針轉動,另一個繼續逆時針轉動。另一方面,如果使用CABasicAnimation,你有一個從值(隱式或顯式)和一個值,所以你能夠表達「增加」的概念(即正差異意味着順時針旋轉)。如果通過設置byValue來設置動畫,則更加清晰。

+0

謝謝你,馬特! – Bzmario