UIAnimation阻止奇怪的行为

时间:2012-10-14 19:41:53

标签: iphone ios uiview uiviewanimation

大家好,感谢您的阅读,

我尝试使用动画块制作简单的波动画:

[UIView animateWithDuration:0.6 delay:i*delay options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAutoreverse animations:^{
        tab.frame = CGRectMake(tab.frame.origin.x,
                               tab.frame.origin.y-WAVE_SIZE,
                               tab.frame.size.width,
                               tab.frame.size.height);
    } completion:^(BOOL finished) {

        tab.frame = CGRectMake(tab.frame.origin.x,
                               tab.frame.origin.y+WAVE_SIZE,
                               tab.frame.size.width,
                               tab.frame.size.height);
    }];

问题是当动画结束时,当我试图将视图返回到之前的状态(因为我正在使用重复效果)时,一个奇怪的跳跃进入,注意完成块。

如果有人遇到这样的问题请分享,

再次感谢。

2 个答案:

答案 0 :(得分:2)

这与完成块从视图的模型值触发相对于图层更新的时间有关,模型值设置在动画的中间。在没有将API下放到CAAnimation的情况下,我发现使这种事情100%有效的唯一方法是将动画分成两部分而不是像UIViewAnimationOptionAutoreverse这样使用{

[UIView animateWithDuration:0.3
                      delay:i*delay
                    options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationCurveEaseIn
                 animations:^{
                     tab.frame = CGRectMake(tab.frame.origin.x,
                                            tab.frame.origin.y-WAVE_SIZE,
                                            tab.frame.size.width,
                                            tab.frame.size.height);
                 }
                 completion:^(BOOL finished) {
                     [UIView animateWithDuration:0.3
                                           delay:0.0
                                         options: UIViewAnimationCurveEaseOut
                                      animations:^{
                                          tab.frame = CGRectMake(tab.frame.origin.x,
                                                                 tab.frame.origin.y+WAVE_SIZE,
                                                                 tab.frame.size.width,
                                                                 tab.frame.size.height);
                                      }
                                      completion:NULL];

                 }];

这确保了在每个动画结束时,视图的模型值(即其当前位置)与动画的最终帧相同。这意味着你没有得到那种抖动效果。

这使UIViewAnimationOptionAutoreverse看起来有点无意义。如果它可以使视图的模型值与动画的最终帧不同,为什么会使用它?当与UIViewAnimationOptionRepeat结合使用时,它会产生相当令人愉悦的效果,直到被移除为止。

答案 1 :(得分:2)

jackslash是对的。在这个简单的场景中解决问题的另一种更简单的方法是在动画之前保存帧,然后恢复它,la:

CGRect oldFrame = tab.frame;

[UIView animateWithDuration:0.6 delay:i*delay options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAutoreverse animations:^{
    CGRect newFrame = oldFrame;
    newFrame.origin.y -= WAVE_SIZE;
    tab.frame = newFrame;
} completion:^(BOOL finished) {
    tab.frame = oldFrame;
}];