是否可以在不使用完成块的情况下在UIView上执行多个动画

时间:2014-06-17 14:58:12

标签: ios uiviewanimation

这个简单的问题只是为了说明一点,我的具体代码要复杂得多。

假设我的UILabel位于TOP LEFT的位置 使用此代码,我将把它移到TOP RIGHT:

    // labelMove is moved to TOP RIGHT
    [UIView animateWithDuration:1.0f
                          delay:2.0f
                        options:UIViewAnimationOptionCurveEaseOut
                     animations:^
     {
         labelMove.center = CGPointMake(250.0f, 40.0f);
     }
                     completion:nil];

如果我有这段代码:

// labelMove is moved to TOP RIGHT
[UIView animateWithDuration:1.0f
                      delay:2.0f
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^
 {
     labelMove.center = CGPointMake(250.0f, 40.0f);
 }
                 completion:nil];

// labelMove is moved to BOTTOM RIGHT
[UIView animateWithDuration:1.0f
                      delay:2.0f
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^
 {
     labelMove.center = CGPointMake(250.0f, 450.0f);
 }
                 completion:nil];

它不会从TOP LEFT开始,而是从TOP RIGHT开始,然后去BOTTOM RIGHT 不知何故,第一个动画不是动画,只是最后一个动画 我不明白为什么,但那不是那么重要 我可以把第二个完成:首先阻止然后它会起作用。
喜欢这段代码。

// labelMove is moved to TOP RIGHT
[UIView animateWithDuration:1.0f
                      delay:2.0f
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^
 {
     labelMove.center = CGPointMake(250.0f, 40.0f);
 }
                 completion:^(BOOL finished){
                     // labelMove is moved to BOTTOM RIGHT
                     [UIView animateWithDuration:1.0f
                                           delay:2.0f
                                         options:UIViewAnimationOptionCurveEaseOut
                                      animations:^
                      {
                          labelMove.center = CGPointMake(250.0f, 450.0f);
                      }
                                      completion:nil];
                 }];

问题
是否可以从最后一个代码生效,但不以任何方式使用完成块 这对我来说非常重要 我尝试使用CABasicAnimation,但是不能这样做,也许有经验丰富的人可以吗? 我确信必须有某种方式,但我无法弄明白。

2 个答案:

答案 0 :(得分:1)

您可以使用CAKeyframeAnimation,并使用这两个点创建路径。

以下是苹果的一些例子:

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Animation_Types_Timing/Articles/PropertyAnimations.html

答案 1 :(得分:1)

没有完成块的代码不起作用,因为您试图在完全相同的时间点将标签设置为两个不同的位置。这实际上是不可能的。

当您在完成块中运行第二个动画时,您在第一个动画之后运行它,而不是同时。要获得相同的效果,请调度第二个动画,以便在第一个动画之后执行。由于第一个动画需要2.0延迟+ 1.0持续时间= 3.0秒才能完成,在3.0秒后发送。见下文。

// labelMove is moved to TOP RIGHT
[UIView animateWithDuration:1.0f
                      delay:2.0f
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^
 {
     labelMove.center = CGPointMake(250.0f, 40.0f);
 }
                 completion:nil];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    // labelMove is moved to BOTTOM RIGHT
    [UIView animateWithDuration:1.0f
                          delay:2.0f
                        options:UIViewAnimationOptionCurveEaseOut
                     animations:^
     {
         labelMove.center = CGPointMake(250.0f, 450.0f);
     }
                     completion:nil];
});

请注意,如果不使用完成块,则无法确保第一个动画真正完成动画。在实践中,这通常应该没问题。