iOS 为已经动画化的 UIView 添加了第二个动画



我有一个名为waves的UIView,它有一个很好的无尽的"浮动"动画

  [UIView animateWithDuration:1
                      delay:0
                    options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveEaseInOut
                 animations:^{
                     CGPoint center = waves.center;
                     center.y += 5;
                     waves.center = center;
                 } 
                 completion:nil];

现在,如果我添加另一个动画,比如将此视图移动到其他位置,"浮动"动画将停止。这是一个合理的反应,在完成块中再次开始"浮动"是没有问题的。我只是想知道我是否遗漏了一些东西,也许在动画选项中,以一种不会相互干扰的方式将两者结合起来。

如果第二个动画基于 CGAffineTransfromScale,我可以这样做,它们组合起来没有问题,但是当我移动视图的中心时,情况并非如此。

更新:发现性能错误。我有一个按钮,用于调用负责通过动画移动视图中心的方法。如果我在上一个动画完成之前按得太快,视图只会捕捉到新位置而不进行动画,并且不会调用完成块。下面是该方法的代码:

- (void)wavesAnimationReversed:(BOOL)reversed {
    CGFloat y = waves.frame.size.height*0.25;
    y = reversed ? -y : y;
    // CGFloat damping = reversed ? 1 : 0.65;
    CGFloat damping = 1;    
    [UIView animateWithDuration:kWAVES_ANIMATION_DURATION
                          delay:0
         usingSpringWithDamping:damping
          initialSpringVelocity:0
                        options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         CGPoint center = waves.center;
                         center.y += y;
                         waves.center = center;
                     }
                     completion:^(BOOL finished) {
                         [self handleStartWavesFloating];
                     }];
}

如果要执行多个动画,则应使用animateKeyFrames。话虽如此,您无法对正在动画的内容进行动画处理(您的描述与将要发生的事情完全匹配)。也就是说,由于视图中的值已更改(它是实际值),因此动画的发生不受您的控制。

因此,如果创建新动画,默认值为第一个动画的结束值,当第二个动画触发时,它会自动将视图移动到新位置以启动第二个动画。

最新更新