在iOS中,当视图动画已经动画化时,会发生什么?

时间:2012-06-04 11:35:53

标签: iphone ios uiview uikit

当手势识别器点击主视图为视图设置动画时:

-(void) doAnimate {
    [UIView animateWithDuration:3 

                     animations:^{
                         self.circleView.center = CGPointMake(100, 300);
                     }

                     completion:^(BOOL finished) {
                         NSLog(@"finished is %i", finished);
                         [UIView animateWithDuration:1 animations:^{
                             self.circleView.center = CGPointMake(250, 300);
                         }];
                     }
     ]; 
}

(有链式动画)。如果它是动画并再次点击主视图,我实际上看到两次调用完成处理程序,第一次使用TRUE,第二次使用FALSE。我以为它只被叫一次,假的?我在Apple's doc找不到它。如果动画已经开始动画,它是否有一个规则如何工作? (我认为应用它是同样的视图再次动画,并且如果view2动画而view1是动画的,则不适用?)


更新:以下代码可以显示更多信息:

-(void) dropAnimate:(UIGestureRecognizer *) g {

    int n = arc4random() % 10000;
    int y = 501 + arc4random() % 200;
    NSLog(@"y is %i", y);
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, y, 10, 10)];
    label.text = @"x";
    [self.view addSubview:label];

    [UIView animateWithDuration:3 

                     animations:^{
                         NSLog(@"n is %i", n);
                         self.circleView.center = CGPointMake(100, y);
                     }
                     completion:^(BOOL finished) {
                         NSLog(@"n is %i", n);
                         NSLog(@"finished is %i   y is %i", finished, y);
                         [UIView animateWithDuration:3 animations:^{
                             self.circleView.center = CGPointMake(250, y);
                         }
                          ];

                     }

     ];
    NSLog(@"finished the method call");

}

除了@Kai在下面的答案之外,似乎在已经有动画进行时,同一个UIView对象的新动画有一个规则:旧动画将立即完成其效果,并运行新动画,然后接下来使用completion调用旧动画的NO,现在启动第3个动画,这会导致动画2完成效果,但接下来调用其completion块,使用NO,它会使动画3立即生效...我们看到动画4运行3秒钟。

可以尝试上面的示例代码...并且为了简化它,只需删除completion块,然后尝试它,并确认规则:如果我们在上面开始一个新的动画同一个对象,旧动画立即生效,新动画运行...

使用completion块,如果completion块启动另一个动画,它会变得非常复杂......

所以我认为最后一件事是:是否有任何文档或规范指明了这种行为?

1 个答案:

答案 0 :(得分:1)

我认为会发生以下情况:

您的第一个触发器将center设置为(100,300),然后为视图设置动画(请注意center property在实际看到之前发生了变化!)。您的第二个触发器立即返回(使用completion调用YES),因为没有任何动画(该属性之前已经设置为相同的值)并重置center并由此强制第一个动画(仍然在运行)以NO停止,因为circleview通过获取新的center从它的动画中消失了(注意第二个触发器在调用之前不会打扰第一个动画) completion,因为circleview的{​​{1}}未更改。