gpt4 book ai didi

ios - CAKeyframeAnimation 在旋转设备之前不会产生动画

转载 作者:行者123 更新时间:2023-11-29 04:06:27 27 4
gpt4 key购买 nike

在制作关键帧动画时,我似乎忽略了明显的内容。我已经查看了许多代码示例,包括 CAKeyframeAnimation 文档中引用的 Apple 的 MoveMe,但是,我找不到会导致我所看到的情况的差异。

我创建一个 CGMutablePathRef,然后创建一个 CAKeyframeAnimation 并将其设置为沿路径对 ImageView 进行动画处理。创建了一个动画组,以便我可以在完成后删除 View 。

然而,我的动画从未出现。直到我旋转设备。看来 View 的重新布局会导致动画启动。我尝试了诸如 [theImageView setNeedsDisplay] 甚至 setNeedsLayout 之类的明显方法,也在容器 View 上进行了尝试。然而,当我需要的时候仍然无法让它工作。它们仅在我旋转设备时才会显示。

在下面的内容中,-cgPathFromArray:采用内部操作码的NSArray,并将其转换为CGPathRef。它被验证是正确的,因为当我旋转设备时,动画确实沿着编程的路径显示。

- (void) animateImage: (NSString*) imageName
onPath: (NSArray*) path
withDuration: (NSString*) duration
{
if (self.sceneView)
{
CGMutablePathRef animationPath = [self cgPathFromArray: path];

if (animationPath)
{
UIImage* image = [self findImage: imageName];

if (image)
{
UIImageView* imageView = [[UIImageView alloc] initWithFrame: CGRectMake(0, 0, image.size.width, image.size.height)];

if (imageView)
{
CAKeyframeAnimation* keyFrameAnimation = [CAKeyframeAnimation animationWithKeyPath: @"position"];

imageView.image = image;

[self.sceneView addSubview: imageView];

keyFrameAnimation.removedOnCompletion = YES;
keyFrameAnimation.fillMode = kCAFillModeForwards;
keyFrameAnimation.duration = duration.floatValue;
keyFrameAnimation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionLinear];
keyFrameAnimation.repeatCount = 0;

keyFrameAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];

[keyFrameAnimation setPath: animationPath];

//group animation with termination block to cleanup
CAAnimationGroup* group = [CAAnimationGroup animation];

group.duration = keyFrameAnimation.duration;
group.removedOnCompletion = YES;
group.fillMode = kCAFillModeForwards;
group.animations = @[keyFrameAnimation];

CorpsAnimationCompletionBlock theBlock = ^void(void)
{
[imageView removeFromSuperview];
};

[group setValue: theBlock
forKey: kCorpsAnimationCompletionBlock];

group.delegate = self;

[imageView.layer addAnimation: group
forKey: nil];
}
}
}
}
}

有人可以帮忙吗?

最佳答案

您可能会遇到麻烦,因为您在将动画添加到图层的同一事务中将图层添加到可见图层树。核心动画不喜欢将动画附加到尚未提交的图层。您可以通过在添加图层后执行 [CATransactionlush] 来解决此问题。

由于嵌套过多,您的代码很难查看。考虑使用提前返回以使其更具可读性。

此外,您还显式创建了 -[UIImage initWithImage:] 初始值设定项为您创建的相同框架。

如果您使用动画组并简单地设置委托(delegate)以便可以在动画结束时执行 block ,则有一种更简单的方法。您可以开始CATransaction,设置事务的完成 block ,然后添加动画,然后提交事务。

因此:

- (void) animateImage:(NSString *)imageName onPath: (NSArray *)path
withDuration: (NSString *)duration
{
if (!self.sceneView)
return;

CGMutablePathRef animationPath = [self cgPathFromArray:path];
if (!animationPath)
return;

UIImage *image = [self findImage:imageName];
if (!image)
return;

UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[self.sceneView addSubview: imageView];

// commit the implicit transaction so we can add an animation to imageView.
[CATransaction flush];

[CATransaction begin]; {
[CATransaction setCompletionBlock:^{
[imageView removeFromSuperview];
}];

CAKeyframeAnimation *animation = [CAKeyframeAnimation
animationWithKeyPath:@"position"];
animation.duration = duration.floatValue;
animation.timingFunction = [CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear];
animation.path = animationPath;
[imageView.layer addAnimation:animation forKey:animation.keyPath];
} [CATransaction commit];
}

关于ios - CAKeyframeAnimation 在旋转设备之前不会产生动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15116151/

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