gpt4 book ai didi

ios - 同一对象上的 2 个动画,仅最后一次显示。如何显示第一个没有嵌套完成 block 的?

转载 作者:行者123 更新时间:2023-11-28 20:34:28 25 4
gpt4 key购买 nike

我正在使用 block 在同一个 UIImageView 上制作两个动画。动画不是完全背靠背,而是差不多;中间有一些逻辑。

  • 将 UIImageView 从 View 上的一个位置移动到另一个位置。
  • 执行确定是否允许图像保留在那里的逻辑
  • 如果不允许,撤消动画(UIImageView 弹回到原来的位置)

如果我按上面的方式实现它,则只会显示第二个动画(据我所知,这是正常行为)。如果我将逻辑和第二个动画 block 嵌套在第一个的完成 block 中,我会看到两个动画,但是有相当多的代码塞进了那个完成 block ,它看起来很丑陋而且不合适。

在非嵌套配置下,为什么iOS要截断前面的动画,只执行最后一个,我如何强制它等待第一个,然后再去下一个?我认为它不需要阻塞主线程或在完成 block 中“坐下来旋转”;我只想显示所有动画。尝试为第二个动画添加延迟但无济于事。

这是 CAKeyframeAnimation 的工作吗?

// first animation

[UIView animateWithDuration:0.5
delay:0.0
options: UIViewAnimationCurveLinear
animations:^{movingColor.center = newCenter;
movingColor.transform = scaleTransform;}
completion:^(BOOL finished){ NSLog(@"forward animation done");}];

if (/* ...color is allowed at that location */) {

// do some stuff

} else {

// undo the animation

[UIView animateWithDuration:0.5
delay:0.0
options: UIViewAnimationCurveLinear
animations:^{movingColor.center = origCenter;
movingColor.transform = scaleTransform;}
completion:^(BOOL finished){ NSLog(@"back animation done");}];
}

最佳答案

第二个动画应该在第一个的完成 block 内有条件地完成。将其放入函数中会使其更具可读性。

- (void)moveColor:(UIView *)view to:(CGPoint)center delay:(NSTimeInterval)delay completion:(void (^)(BOOL finished))complete {

[UIView animateWithDuration:0.5 delay:delay options:UIViewAnimationCurveLinear animations:^{
view.center = center;
view.transform = scaleTransform; // probably don't need this
} completion:completion];
}

这样你的逻辑就可以从动画代码中分离出来

- (void)someMethod {

[self moveColor:movingColor to:newCenter delay:0.0 completion:^(BOOL finished) {
if (/*it can stay*/) {
// stuff
} else {
[self moveColor:movingColor to:origCenter delay:2.0 completion:^(BOOL finished) {}];
}
}];
}

关于ios - 同一对象上的 2 个动画,仅最后一次显示。如何显示第一个没有嵌套完成 block 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11072048/

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