Ios UIViewAnimationOptionBeginFromCurrentState出现意外行为

Ios UIViewAnimationOptionBeginFromCurrentState出现意外行为,ios,Ios,我正在尝试使用UIViewAnimationOptionBeginFromCurrentState实现多级动画,以允许用户随意取消动画。动画是在两个大小之间连续循环地设置动画的视图。当用户触摸视图以取消动画时,我希望视图快速恢复到其原始的小尺寸,无论它当时是增大还是缩小 我通过两个单独的动画来实现多级方面,一个用于增加视图,另一个用于缩小视图。每一个调用其完成块中的另一个例程,因此永远循环,除非设置了中止标志 如果在“生长视图”动画期间调用“中止”,我将获得预期的行为:动画将快速、立即将视图返回

我正在尝试使用UIViewAnimationOptionBeginFromCurrentState实现多级动画,以允许用户随意取消动画。动画是在两个大小之间连续循环地设置动画的视图。当用户触摸视图以取消动画时,我希望视图快速恢复到其原始的小尺寸,无论它当时是增大还是缩小

我通过两个单独的动画来实现多级方面,一个用于增加视图,另一个用于缩小视图。每一个调用其完成块中的另一个例程,因此永远循环,除非设置了中止标志

如果在“生长视图”动画期间调用“中止”,我将获得预期的行为:动画将快速、立即将视图返回到其原始的小尺寸并停止。好!

但是,如果在收缩视图动画循环期间调用了abort,则视图将以相同的速度继续收缩(然后按预期停止),就像从未调用UIViewAnimationOptionBeginFromCurrentState选项一样

代码希望能让这更清楚,希望有人能看到我看不到的东西

- (void)stopAnimating {
    abort = YES;

    [UIView animateWithDuration:.2 // some small interval
                          delay:0
                        options:UIViewAnimationOptionBeginFromCurrentState
                     animations:^{ self.frame = minRect;}
                     completion:^(BOOL done){}
     ];
}

- (void)animateSmall {
    [UIView animateWithDuration:4
                          delay:0
                        options:UIViewAnimationOptionAllowUserInteraction
                     animations:^{self.frame = minRect;}
                     completion:^(BOOL done){if (!abort)[self animateBig];}
     ];
}

- (void)animateBig {
    [UIView animateWithDuration:4
                          delay:0
                        options:UIViewAnimationOptionAllowUserInteraction

                     animations:^{self.frame = maxRect;}
                     completion:^(BOOL done){if (!abort)[self animateSmall];}
     ];
}

这里只是一个猜测,因为你的代码看起来和我完全一样。但我认为发生的事情是,中止动画将同一属性设置为与它中断的动画相同的值,这被视为等效的,不需要更改(即使持续时间更改)

对这个理论的一个检验——以及对这个问题的一个解决方案——就是使你的振荡minRect在大小上与你的稳态minRect稍有不同


希望这能奏效。祝你好运。

我想你成功了。不过,还有一个小难题。如果我使用显式的CGRect newMinRect=CGRectMake(…)稍微更改最终大小,代码将在收缩阶段执行适当的操作。但是,如果我使用CGRectOffset(minRect,…)将minRect函数更改为完全相同的值,则在矩形收缩时仍会出现一些意外行为。矩形的原点在移动过程中向左或向右移动其预期位置,这取决于调用abort之前等待的时间,以及在预期的最终x位置完成之前等待的时间。非常奇怪。很难想象,但我认为您可能在寻找插入而不是偏移,如下所示:self.frame=UIEdgeInsetsInsetRect(self.frame,UIEdgeInsetsMake(1,1,1,1));不过,你可能仍然看到了这种奇怪。再一次凭直觉,如果你在你的摆动的最小矩形上,而不是在你的最终状态矩形上尝试插入技巧,会怎么样?(当然,不要一次又一次地插入它,只在动画循环之外插入一次)。仍然有奇怪的效果。插入和偏移不应该有什么区别,是吗?只要框架略有变化。但这看起来毫无意义。也许可以尝试在动画块内进行一些NSLogging,看看rect是否符合您的期望。您可能已经知道的另一件事是模拟器上的调试菜单有一个名为“切换慢速动画”的项。如果你用它,它可能会暗示你的眼睛不见了。