ios - UIView animateWithDuration 完成已完成 = YES 尽管已被取消?

标签 ios objective-c animation uiview

我在用户交互中运行此动画,有时动画可能会在正在进行的动画完成之前再次运行。我希望它做的是取消以前的动画并继续新的动画。

[UIView animateWithDuration:duration
                      delay:0
                    options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^{
                     self.bounds = bounds;
                 }
                 completion:^(BOOL finished) {
                     if (finished) {
                         // Do some cleanup after animating.
                     }
                 }];

从视觉上看,这似乎可行,但在我的完成 block 中,我被告知它在两种情况下都已完成,这导致清理代码过早运行。因此,第一个动画的完成 block 在第二个动画开始后立即运行,finished = YES。我希望它的完成值为 NO,第二个(完成后)为 YES

有没有办法知道动画是完成了还是被另一个人取消了?

旁注:我尝试使用 CABasicAnimation 制作相同的动画,然后第一次完成 = NO,第二次完成 YES,所以我得到的行为似乎特定于 animateWithDuration

这是一个 GIF,显示了上述代码的运行情况,持续时间为 10,完成 block 更新了标签。如您所见,每次使用 animateWithDuration 调用重新启动动画时,finished 都是 YES:

最佳答案

所以我进一步调查了这一点,我认为这是 iOS 8 特有的事情,因为动画现在默认是叠加的,这意味着动画将继续并相互叠加而不是被取消。

在我的搜索中,我找到了 a WWDC session called "Building Interruptible and Responsive Interactions"谈到这个。在 session 中,他们声称动画将同时完成,但在我的测试中并非如此(请参阅问题中的 GIF)。 session 中建议的解决方法是让计数器继续计算动画开始与完成的次数,并在计数器达到零时执行动画后操作。这有点hacky,但有效。这是为此调整的问题代码:

// Add this property to your class.
self.runningAnimations++;
[UIView animateWithDuration:duration
                      delay:0
                    options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^{
                     self.bounds = bounds;
                 }
                 completion:^(BOOL finished) {
                     if (--self.runningAnimations == 0) {
                         // Do some cleanup after animating.
                     }
                 }];

很明显,您需要为每种类型的动画设置一个单独的计数器,这样它最终会变得有点困惑,但我认为没有更好的方法,除非您直接开始使用 CAAnimation .

关于ios - UIView animateWithDuration 完成已完成 = YES 尽管已被取消?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28667189/

相关文章:

iOS FBSDK FBSDKProfileExpressionSharer 在最后一步失败

ios - tableView.deleteRows 后缺少随机 UITableViewCell

ios - 用于插入新对象的 CoreData 语法

iphone - 每天执行一次任务

iphone - 实时格式化美元金额

javascript - jQuery animate() 显示错误 $(...).animate 不是一个函数

ios - 为什么 UITableView 和 UIScrollView 的 bounds 属性中的 "Y"值最初是 "-64"?

ios - 如何在 Objective-C 中使用后台线程?

r - 如何制作高平滑、高分辨率的粒子运动动画

javascript - "Object is undefined"错误,尝试在 three.js 中旋转对象时