2012-06-26 45 views
5

在我的應用程序中,我將CABasicAnimation用於動畫。我想動態改變動畫的速度,所以我添加了一個滑塊來改變速度。以下是我的動畫代碼。但我無法改變速度,當我改變速度值時什麼也沒有發生。如何在動畫中更改速度CABasicAnimation

 CABasicAnimation * a = [CABasicAnimation animationWithKeyPath:@"position"]; 
    [a setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]]; 

    CGPoint startPt = CGPointMake(self.view.bounds.size.width + displayLabel.bounds.size.width/2, 
            displayLabel.frame.origin.y); 
    CGPoint endPt = CGPointMake(displayLabel.bounds.size.width/-2, displayLabel.frame.origin.y); 

    [a setFromValue:[NSValue valueWithCGPoint:startPt]]; 
    [a setToValue:[NSValue valueWithCGPoint:endPt]]; 
    [a setAutoreverses:NO]; 
    [a setDuration:speeds]; 
    [a setRepeatCount:HUGE_VAL]; 
    [displayLabel.layer addAnimation:a forKey:@"rotationAnimation"]; 


    - (IBAction)speedSlider:(id)sender { 

     speeds = slider.value; 

    } 
+0

[更改正在運行的動畫的持續時間(速度)]的可能重複(https://stackoverflow.com/questions/21589483/change-duration-speed-on-a-running-animation) – Fattie

+0

**完整解決方案2017年** ...https://stackoverflow.com/a/45787919/294884,唷 – Fattie

回答

0

設置速度爲你所需要的。

a.duration=0.5; 

嘗試......

+0

我想要基於滑塊值的動態速度。對於靜態值,動畫是完全正確的 –

2

編輯:看起來你將有進一步的問題,雖然:它不look like你可以在正在運行的動畫改變這樣的價值。您將不得不刪除當前的動畫並添加一個新的值。在添加新動畫時,這可能需要小心以防止產生震動效果。

從上面的線程可以通過不重複動畫來完成此操作,而是使用委託(see here)繼續重新添加動畫,併爲下一個動畫循環設置新速度。

原帖:

你正在改變,你已到動畫最初傳遞的價值。這不會影響正在運行的動畫。您需要獲取對該對象的引用,並更改動畫對象的duration屬性。像這樣的事情在你的操作方法:

CABasicAnimation *a = [displayLabel.layer animationForKey:@"rotationAnimation"]; 
a.duration = slider.value; 
+0

上面的代碼沒有任何反應。 –

+0

我已經仔細研究過它,並且無法更改正在運行的動畫的值。看到我的編輯 – jrturton

+0

這裏是你如何使一個**可重新啓動的動畫**這些天在iOS .. https://stackoverflow.com/a/45787919/294884 – Fattie

1

我認爲jrturton是正確的,你不能改變已經運行的動畫的屬性。但是,您可以做的是將動畫分成短片段,並在滑塊值更改時更改下一個片段的速度。

不是從A點到D點的動畫,而是從A-B開始,然後是B-C,然後是C-D。使用父類的animationDidStop檢查當前點,檢查滑塊值並啓動下一個動畫。

這可能會產生生澀的動作,但是如果使用非常小的片段,則可能可以將其平滑化。

1

ü應該停止動畫並重新啓動一個新的一個新的持續時間

但記得要記錄下來fromValue和toValue,並使用舊toValue作爲新fromValue進行無縫改變

6

我想改變速度的最好辦法是改變你的層的時間系統

displayLabel.layer.timeOffset = 
    [displayLabel.layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
displayLabel.layer.beginTime = CACurrentMediaTime(); 
displayLabel.layer.speed= slider.value; 

你可以看到這對推進。 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreAnimation_guide/AdvancedAnimationTricks/AdvancedAnimationTricks.html#//apple_ref/doc/uid/TP40004514-CH8-SW2

+0

這是行不通的;這是無關的。 – Fattie

+0

@Fattie - 可能你正在尋找不同的東西。這是問題的確切答案。它非常適合我。 –

+0

我明白你的意思@LesNie - 是的,它會在某些情況下提供解決方案。但是,它會更改整個圖層的時間範圍。需要更改正在運行的動畫的屬性是一個常見問題(並且在iOS中令人生厭)。我沒有在你的答案上點擊「+1」:)新年快樂! – Fattie

相關問題