UIViewAnimationOptionBeginFromCurrentState出现意外行为

时间:2012-03-21 01:51:15

标签: ios

我尝试使用UIViewAnimationOptionBeginFromCurrentState实现多级动画,以允许用户随意取消动画。动画是一种在两种尺寸之间连续和周期性动画的视图。当用户触摸视图以取消动画时,我希望视图快速恢复到原来的小尺寸,无论是当时是增长还是缩小。

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

如果在生长视图动画期间调用abort,我会得到预期的行为:动画很快并立即将视图返回到原始的小尺寸并停止。好!

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

Code希望能让这个更清晰,希望有人能看到我能做到的。

- (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];}
     ];
}

1 个答案:

答案 0 :(得分:1)

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

对这个理论的测试 - 以及对问题的解决 - 将使你的振荡minRect的大小与你的稳态minRect有点不同。

希望这有效。祝你好运。