我已经将下面的两个方法连接到我的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];
}
干杯加里
答案 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类方法以结束动画块。动画在一个单独的线程中运行,并在应用程序返回到运行循环时开始。其他动画类方法允许您控制块内动画的开始时间,持续时间,延迟和曲线。