animateWithDuration:动画:阻止主线程?

fuz*_*oat 40 iphone animation multithreading cocoa-touch objective-c

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

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

较旧的样式版本(下方)允许在动画计时器结束之前按下按钮,只需将计时器重置为重新开始.如果这些都是相同的,我是否遗漏了某些东西,或者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];
}
Run Code Online (Sandbox Code Playgroud)

干杯加里

zpa*_*ack 93

使用块进行动画处理不会阻止主线程.我认为您所看到的行为是因为默认情况下,用户交互是使用新的块调用禁用持续时间动画.您可以通过传递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];
}
Run Code Online (Sandbox Code Playgroud)

  • 啊,这有道理,我错过了文档中的选项,我会查找它.非常感谢,非常感谢. (2认同)