2014-11-24 116 views
0

我有一个UIView称为,它有一个很好的无尽的“浮动”动画的iOS添加第二个动画已经动画的UIView

[UIView animateWithDuration:1 
         delay:0 
        options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveEaseInOut 
       animations:^{ 

        CGPoint center = waves.center; 
        center.y += 5; 
        waves.center = center; 

       } 
       completion:nil]; 

现在,如果我添加其他动画,说提出这个观点的不同位置,“浮动”动画停止。这是一个合理的反应,在完成块中再次启动“浮动”是没有问题的。我只是想知道如果我错过了某些东西,或许在动画选项中,将两者结合起来,不会相互打断。

我能这样做,如果第二动画是基于CGAffineTransfromScale,他们结合没有问题,但是当我移动视图的中心是不是这样的。

UPDATE:发现了一个bug性能。我有一个按钮,调用负责使用动画移动视图中心的方法。如果在上一个动画完成之前按下它太快,View只会捕捉到新的位置而没有动画,并且不会调用完成块。以下是该方法的代码:

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

怎么样'UIViewAnimationOptionBeginFromCurrentState'标志? – 2014-11-24 12:35:24

+0

@GuyKogus不,不会做的伎俩 – NKorotkov 2014-11-24 12:55:47

+0

关于你提到的更新,如果你不希望发生的卡,然后检查是否'finished'是真实的(或'YES',相当)。另外,如果对变换进行动画处理,那么为什么不尝试在动画块中使用'CGAffineTransfromTranslate'? – 2014-11-24 14:05:09

回答

0

如果要执行多个动画,则应使用animateKeyFrames。 这就是说,你不能动画正在动画的东西(你的描述完全匹配会发生什么)。也就是说,因为视图中的值已经被更改(它是真实值),所以动画发生在您的控制之外。

因此,如果您创建一个新的动画,默认值是您的第一个动画的最终值时,第二个动画触发器,它会自动在视图中移动到新的位置开始第二动画。

+0

我相信这是正确的,你可以结合缩放和移动动画的唯一原因是它们改变了对象框架的不同属性。 – NKorotkov 2014-11-27 10:40:10

+0

@NKorotkov这是真的,但如果你这样做,你在同一个UIView动画块内。 – wolffan 2014-11-27 12:28:59