[英]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.