取消 UIView 动画 - self.view.layer removeAllAnimations 不起作用

Posted

技术标签:

【中文标题】取消 UIView 动画 - self.view.layer removeAllAnimations 不起作用【英文标题】:Cancelling UIView Animation - self.view.layer removeAllAnimations not working 【发布时间】:2012-09-15 18:46:02 【问题描述】:

我有一个 UIView 动画正在进行,我需要在我的 ios 应用程序中取消它。我试过这个:

[self.view.layer removeAllAnimations];

但它没有用。动画继续。这是我的动画代码:

[UIView animateWithDuration:1.4 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^
recognizer.view.transform = CGAffineTransformTranslate(recognizer.view.transform, translation.x, translation.y);
 completion:^(BOOL finished) 

            NSLog(@"completed animation, now do whatever");
        ];

有人知道为什么它不起作用吗?

【问题讨论】:

您正在将该动画添加到识别器视图,因此您必须将其从同一视图的图层中删除。因此,您可能想要 [recognizer.view.layer removeAllAnimations] 而不是 [self.view.layer removeAllAnimations]。 嗨。谢谢 - 现在正在发生一些事情,但这引入了另一个问题。它将动画带到最后立即停止。我希望它停在它的当前位置——当我想停止动画时它所处的位置——而不是跳到最后。可以这样做吗? 查看recognizer.view.layer.presentationLayer。它将具有中间变换,只需将其设置为当前层:recognizer.view.layer.transform = recognizer.view.layer.presentationLayer.transform; ...可能需要更多工作。 在设置动画时保持对象当前状态的行出现此错误:“在类型为 'id' 的对象上找不到属性 'transform'” 【参考方案1】:

您正在将该动画添加到识别器的视图中,因此您必须将其从同一视图的图层中删除。

所以不是

[self.view.layer removeAllAnimations];

你可能想要

[recognizer.view.layer removeAllAnimations];

为了保持转换的当前状态,从表示层获取那个。表示层是实际反映动画期间变化的层。

recognizer.view.layer.transform = recognizer.view.layer.presentationLayer.transform;

【讨论】:

感谢前 2 个。最后一部分保持状态的问题。收到此错误:“在 'id' 类型的对象上找不到属性 'transform'”【参考方案2】:

好的 - 刚刚想通了。将动画组件 beng 从图像视图顶部的手势识别器更改为图像视图本身。现在,就在停止动画的代码之前,我有:

 truckView.frame = [[trackView.layer presentationLayer] frame];
 [truckView.layer removeAllAnimations];

所以这就是这样做的方法。感谢您帮助我找到这个答案,

山姆

【讨论】:

我正在使用这个但开始思考因为它在删除所有动画之前获取帧,动画实际上继续一点点并且设置的帧已经过时

以上是关于取消 UIView 动画 - self.view.layer removeAllAnimations 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 滚动时 UIView 动画停止工作

我将如何为bringSubviewToFront 编写 UIView 淡入动画

UIView.animate 不在一个功能上制作动画

UIView 动画交互

使用 Swift 自动布局动画 UIButton

如果 layoutIfNeeded() 被调用,UIView 约束不会动画