代码之家  ›  专栏  ›  技术社区  ›  fuzzygoat

AnimateWithDuration:动画:阻止主线程吗?

  •  38
  • fuzzygoat  · 技术社区  · 14 年前

    我已经将下面的两种方法连接到我的用户界面中的单独按钮上,但是我注意到在按下“版本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 回复  |  直到 13 年前
        1
  •  92
  •   zpasternack    13 年前

    用块设置动画不会阻塞主线程。我认为您看到的行为是因为,默认情况下,用户交互是用新的块调用禁用持续时间动画的。您可以通过传递uiviewAnimation选项allowUserInteraction(调用 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];
    }
    
        2
  •  1
  •   vodkhang    14 年前

    对于animateWithDuration:,类引用没有提到线程,因此我不确定。

    为了 beginAnimations:context: and commitAnimation: 是的,它们在一个单独的线程中运行 UIView class Reference .

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