iOS向已经动画的UIView添加第二个动画

Posted

技术标签:

【中文标题】iOS向已经动画的UIView添加第二个动画【英文标题】:iOS adding second animation to already animated UIView 【发布时间】:2014-11-24 12:32:02 【问题描述】:

我有一个名为 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];
                     ];

【问题讨论】:

UIViewAnimationOptionBeginFromCurrentState 标志呢? @GuyKogus 不,不成功 关于您的更新,如果您不希望发生快照,请检查finished 是否为真(或YES,而是)。另外,如果对变换进行动画处理,那么为什么不在动画块中尝试使用CGAffineTransfromTranslate 如果您不希望发生这种情况,请禁用该按钮并按照@GuyKogus 的建议使用完成块再次启用它。 @wolffan 是的,这就是我最终所做的。 【参考方案1】:

如果你想执行多个动画,你应该使用 animateKeyFrames。 话虽如此,您无法为正在动画的东西设置动画(您的描述与将要发生的事情完全匹配)。也就是说,由于您视图中的值已经更改(它是真实值),因此动画发生在您的控制之外。

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

【讨论】:

我相信这是正确的,你可以结合缩放和移动动画的唯一原因是它们改变了对象框架的不同属性。 @NKorotkov 这是真的,但如果你这样做,你会在同一个 UIView 动画块内进行。

以上是关于iOS向已经动画的UIView添加第二个动画的主要内容,如果未能解决你的问题,请参考以下文章

我可以立即停止第一个 UIView 动画并在同一视图上启动第二个动画吗?

用屏幕点击停止 UIView 动画

iOS - 使用自动布局执行多个同步动画

iOS:在两个动画视图之间画线

ios动画不会在第二个视图中开始[关闭]

顺序 UIView 转换