gpt4 book ai didi

ios - UIView出现时重启CALayer动画

转载 作者:行者123 更新时间:2023-12-01 19:02:43 24 4
gpt4 key购买 nike

我有一个自定义 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

在 View Controller 中,我这样做是为了让我的动画每次都从头开始:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear: animated];

[pieChart setProgress: 0.0];
}

这一切都完美无缺。我将图层放在 View 上, View 放在 View Controller 中,一切都按预期工作。

复杂之处在于我的 View Controller 位于 UIScrollView 内。 .这提出了一种情况,即用户可以在 CALayer 之前从我的 View Controller 上滑开。动画完成。如果他们快速向后滑动, CALayer动画做了一些奇怪的事情。它逆转。这就像动画试图回到开始。一旦它到达那里,它就会重新开始,并按照它应该的方式进行动画处理。

所以问题是,我怎样才能防止这种情况发生。我希望每次显示 View 时动画都从头开始——不管上次发生了什么。

有什么建议么?

更新

这是问题的直观示例:

在职的:

enter image description here

失败:

enter image description here

最佳答案

在您在那里的设置中,您有一个关键“进度”的隐式动画,因此每当图层的进度属性发生变化时,它就会动画。这在值增加和减少时都有效(如第二张图片所示)。

要在没有动画的情况下将图层恢复为默认的 0 进度状态,您可以将属性更改包装在禁用所有操作的 CATransaction 中。这将禁用隐式动画,以便您可以从 0 进度重新开始。

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

关于ios - UIView出现时重启CALayer动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21791310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com