Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否可以在UIView上执行多个动画而不使用完成块_Ios_Uiviewanimation - Fatal编程技术网

Ios 是否可以在UIView上执行多个动画而不使用完成块

Ios 是否可以在UIView上执行多个动画而不使用完成块,ios,uiviewanimation,Ios,Uiviewanimation,这是一个简单的问题,只是为了说明这一点,我的具体代码要复杂得多 假设我的UILabel位于左上角。 使用此代码,我将其移动到右上角: // labelMove is moved to TOP RIGHT [UIView animateWithDuration:1.0f delay:2.0f options:UIViewAnimationOptionCurveEaseOut

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

假设我的UILabel位于左上角。
使用此代码,我将其移动到右上角:

    // 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];
它不会从左上角开始,而是从右上角开始,然后从右下角开始。
不知何故,第一个动画不是动画,只有最后一个。
我不明白为什么,但这并不重要。
我可以在完成时放第二个:首先阻塞,然后它就会工作。
像这样的代码

// 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];
                 }];
问题
是否可以从上一个代码开始生效,但不以任何方式使用完成块。
这对我来说非常重要。
我尝试过CABASICANIATION,但做不到,也许有经验的人可以?

我相信一定有办法,但我就是想不出来

可以使用CAKeyframeAnimation,并使用两点创建路径

以下是苹果公司的一些例子:


没有完成块的代码无法工作,因为您试图在完全相同的时间点将标签动画化到两个不同的位置。这在物理上是不可能的

在完成块内运行第二个动画时,将在第一个动画之后运行,而不是同时运行。要获得相同的效果,请分派第二个动画,以便在第一个动画之后执行。由于第一个动画需要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];
});

请注意,如果不使用“完成”块,则无法确保第一个动画真正完成动画制作。在实践中,这通常是好的。

很高兴知道。我需要的是独立的动画,然后用一个方法调用它们。哈哈!哈哈哈!你不应该重复你知道的问题。可以使用关键帧在一个动画中从左上角到右上角再到右下角制作动画。但这是一个动画。i、 在每个动作之间你不需要做任何逻辑。它会一直走下去,或者一点也不走。但是,只需使用补全。这不会给你带来疾病,而且可以做得很好。唯一的另一种方法(这真的不是一个好主意)可能是延迟后续动画的开始。但是你不能保证时间是正确的。你还必须在一个地方调用所有的动画。@Fogmeister bout问题解决同样的问题。我开始问第二个问题,因为它不依赖于我的项目,所以更容易理解这个问题。关于你们对第一个问题的回答,我可以和代表们一起回答(至少我这么认为),但我会尽量避免回答。目前我正在学习核心动画的细节,以se是这甚至是可能的。谢谢你的帮助。谢谢你的重播,但我仍然有一个问题。我已经在Xcode 5.1.1上的iOS模拟器(从6.0到7.1)中试用了您的代码。它仍然是从右上角开始的(第一个动画之后应该在哪里),而不是从左上角开始的(故事板中的标签设置在哪里)。yuo是在什么设置下一个接一个地制作这两个动画的?很抱歉,我原来的代码是错误的,已经被编辑过了。您应该在第一个动画完成后发送动画代码,而不是增加延迟。原因是动画块会立即运行。如果您将NSLog()记录在中心,您将看到它是在-animateWithDuration:…之后立即出现的新点。。。他跑了。显示会作为动画更新,但第一个动画在第二个动画运行后会被取消,因此它会立即移动(即,看起来像是从右上角开始)。这是可行的,我甚至可以在运行后用另一个调度_再添加一个。关键是使用调度单元,并设置正确的时间。