簡體   English   中英

CABasicAnimation完成時停止動畫-iOS

[英]CABasicAnimation stop animation on completion - iOS

我有一個iOS應用程序,重復使用CABasicAnimation

    CABasicAnimation *fadeAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];
    fadeAnim.fromValue = [NSNumber numberWithFloat:1.0];
    fadeAnim.toValue = [NSNumber numberWithFloat:0.2];
    fadeAnim.duration = 1.0;
    fadeAnim.autoreverses = YES;
    fadeAnim.repeatCount = INFINITY;
    [colourbutton.titleLabel.layer addAnimation:fadeAnim forKey:@"opacity"];

我有一個按鈕,當按下該按鈕時將停止動畫。

-(IBAction)stopAnim {
    [colourbutton.titleLabel.layer removeAllAnimations];
}

它可以正常工作,但我要注意的一件事是突然停止動畫,它不會讓動畫結束。 因此,如何獲取它以完成當前動畫然后停止。 (或者換句話說,如何獲取removeAllAnimations....withAnimation ?)。

附帶說明一下,我是否需要包括CoreAnimation框架才能使其正常工作。 到目前為止,動畫正在運行,我還沒有導入CoreAnimation框架。

謝謝,丹。

只需添加另一個動畫,然后刪除第一個動畫,如下所示:

    CABasicAnimation *endAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    endAnimation.fromValue = @(((CALayer *)colourbutton.titleLabel.layer.presentationLayer).opacity);
    endAnimation.toValue = @(1);
    endAnimation.duration = 1.0;
    [colourbutton.titleLabel.layer addAnimation:endAnimation forKey:@"end"];
    [colourbutton.titleLabel.layer removeAnimationForKey:@"opacity"];

這里的關鍵是使用表示層來獲取當前狀態。 不要忘記設置圖層的實際結束狀態,因為動畫將在完成時被刪除。

在NKorotov的回答中,他使用presentationLayer來找出您在動畫中的位置。 那是正確的方法。

您可以采用此解決方案,盡管IMO也必須正確計算持續時間動畫(基於原始動畫的持續時間以及當前沿動畫路徑的距離)。

如果您發現添加新動畫“很傻”,則可以在正確的時間使用dispatch_after調用removeAllAnimations

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM