animateWithDuration:动画:阻止主线程?

时间:2010-07-13 13:06:00

标签: iphone objective-c cocoa-touch animation multithreading

我已经将下面的两个方法连接到我的UI中的单独按钮,但是注意到按下“VERSION 1”按钮后我再也无法按下按钮,直到方法中的动画持续时间结束。我的理解是动画使用自己的线程,以免阻塞主应用程序。

// VERSION 1
-(IBAction)fadeUsingBlock {
    NSLog(@"V1: Clicked ...");
    [myLabel setAlpha:1.0];
    [UIView animateWithDuration:1.5 animations:^{
        [myLabel setAlpha:0.0];
    }];
}

旧版型(下图)允许在动画计时器结束前按下按钮,只需重置计时器即可重新启动。如果这些都是相同的,我是否遗漏了某些东西,或者3.2和4之间的操作是否有变化?

// VERSION 2
-(IBAction)fadeUsingOld {
    NSLog(@"V2: Clicked ...");
    [myLabel setAlpha:1.0];
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.5];
    [myLabel setAlpha:0.0];
    [UIView commitAnimations];
}

干杯加里

2 个答案:

答案 0 :(得分:92)

使用块动画不会阻止主线程。我认为您所看到的行为是因为默认情况下,用户交互是使用新的块调用禁用持续时间动画。您可以通过传递UIViewAnimationOptionAllowUserInteraction(调用animationWithDuration:delay:options:animations:completion)来覆盖它,如下所示:

-(IBAction) fadeUsingBlock {
    NSLog(@"V1: Clicked ...");
    [myLabel setAlpha:1.0];
    [UIView animateWithDuration:1.5 
                          delay:0
                        options:UIViewAnimationOptionAllowUserInteraction
                     animations:^{
                         [myLabel setAlpha:0.0];
                     }
                     completion:nil];
}

答案 1 :(得分:1)

对于animateWithDuration :,类引用没有说明线程,所以我不确定。

对于beginAnimations:context: and commitAnimation:,是的,他们在一个单独的线程中运行 UIView class Reference

可以对视图对象的某些属性更改进行动画处理 - 例如,设置框架,边界,居中和变换属性。如果在动画块中更改这些属性,则会动态从当前状态到新状态的更改。调用beginAnimations:context:类方法以开始动画块,设置要动画的属性,然后调用commitAnimations类方法以结束动画块。动画在一个单独的线程中运行,并在应用程序返回到运行循环时开始。其他动画类方法允许您控制块内动画的开始时间,持续时间,延迟和曲线。