簡體   English   中英

出現UIView時重新啟動CALayer動畫

[英]Restart CALayer animation when UIView appears

我有一個自定義CALayer其中包含一個名為progress的動畫屬性。 基本代碼是:

@implementation AnimatedPieChartLayer

@dynamic progress;

+ (BOOL)needsDisplayForKey:(NSString *)key {
    return [key isEqualToString: @"progress"] || [super needsDisplayForKey: key];
}

- (id <CAAction>)actionForKey:(NSString *)key {
    if ([self presentationLayer] != nil) {
        if ([key isEqualToString: @"progress"]) {
            CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath: key];
            [anim setFromValue: [[self presentationLayer] valueForKey: key]];
            [anim setDuration: 0.75f];
            return anim;
        }
    }
    return [super actionForKey: key];
}

- (void)drawInContext:(CGContextRef)context {
  // do stuff
}

@end

在視圖控制器中我這樣做,嘗試每次從頭開始動畫:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear: animated];

    [pieChart setProgress: 0.0];
}

一切都很完美。 我將圖層放在視圖上,視圖控制器中的視圖,它都按預期工作。

復雜的是我的視圖控制器在UIScrollView 這表示在CALayer動畫完成之前用戶可以從我的視圖控制器滑動的情況。 如果他們快速向后滑動, CALayer動畫會做一些奇怪的事情。 它逆轉了。 這就像動畫試圖回到起點。 一旦它到達那里它重新開始,並以它應該的方式動畫。

所以問題是,我該如何防止這種情況發生。 我希望每次顯示視圖動畫都從頭開始 - 無論上次發生了什么。

有什么建議么?

UPDATE

以下是問題的可視化示例:

工作:

在此輸入圖像描述

失敗:

在此輸入圖像描述

在那里的設置中,您有一個關鍵“progress”的隱式動畫,這樣每當圖層的progress屬性發生變化時,它就會生成動畫。 這在值增加和減小時都有效(如第二張圖片所示)。

要在沒有動畫的情況下將圖層恢復為默認的0進度狀態,可以將屬性更改包裝在禁止所有操作的CATransaction中。 這將禁用隱式動畫,以便您可以從0進度開始。

[CATransaction begin];
[CATransaction setDisableActions:YES]; // all animations are disabled ...
[pieChart setProgress: 0.0];
[CATransaction commit]; // ... until this line

可能過於簡單的建議值得“回答”,但我建議取消動畫。 看起來你可以很容易地重寫這段代碼,以便進度更新檢查一些完整的標志,然后當視圖被隱藏時,殺死它。 這個帖子有一些很好的想法。

暫無
暫無

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

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