gpt4 book ai didi

ios - 核心动画进度回调

转载 作者:IT王子 更新时间:2023-10-29 08:07:47 24 4
gpt4 key购买 nike

有没有一种简单的方法可以在 Core Animation 运行时到达特定点(例如,完成度的 50% 和 66% 时)回调?

我目前正在考虑设置一个 NSTimer,但这并不像我想要的那样准确。

最佳答案

我终于找到了解决这个问题的方法。

基本上,我希望在每一帧都被回调并做我需要做的事情。

没有明显的方法可以观察动画的进度,但实际上是可能的:

  • 首先,我们需要创建一个新的 CALayer 子类,它有一个名为“progress”的动画属性。

  • 我们将层添加到我们的树中,然后创建一个动画,该动画将在动画持续时间内将进度值从 0 驱动到 1。

  • 由于我们的 progress 属性可以设置动画,因此在我们的子类上为动画的每一帧调用 drawInContext。这个函数不需要重绘任何东西,但是它可以用来调用委托(delegate)函数:)

这是类接口(interface):

@protocol TAProgressLayerProtocol <NSObject>

- (void)progressUpdatedTo:(CGFloat)progress;

@end

@interface TAProgressLayer : CALayer

@property CGFloat progress;
@property (weak) id<TAProgressLayerProtocol> delegate;

@end

和实现:

@implementation TAProgressLayer

// We must copy across our custom properties since Core Animation makes a copy
// of the layer that it's animating.

- (id)initWithLayer:(id)layer
{
self = [super initWithLayer:layer];
if (self) {
TAProgressLayer *otherLayer = (TAProgressLayer *)layer;
self.progress = otherLayer.progress;
self.delegate = otherLayer.delegate;
}
return self;
}

// Override needsDisplayForKey so that we can define progress as being animatable.

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

// Call our callback

- (void)drawInContext:(CGContextRef)ctx
{
if (self.delegate)
{
[self.delegate progressUpdatedTo:self.progress];
}
}

@end

然后我们可以将层添加到我们的主层:

TAProgressLayer *progressLayer = [TAProgressLayer layer];
progressLayer.frame = CGRectMake(0, -1, 1, 1);
progressLayer.delegate = self;
[_sceneView.layer addSublayer:progressLayer];

并将其与其他动画一起制作动画:

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"progress"];
anim.duration = 4.0;
anim.beginTime = 0;
anim.fromValue = @0;
anim.toValue = @1;
anim.fillMode = kCAFillModeForwards;
anim.removedOnCompletion = NO;

[progressLayer addAnimation:anim forKey:@"progress"];

最后,委托(delegate)会随着动画的进行被回调:

- (void)progressUpdatedTo:(CGFloat)progress
{
// Do whatever you need to do...
}

关于ios - 核心动画进度回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18827973/

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