我已经将下面的两个方法连接到我的UI中的单独按钮,但注意到在按下“版本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];
}干杯加里
发布于 2010-07-13 23:21:18
使用块设置动画不会阻塞主线程。我认为你看到的行为是因为,默认情况下,用户交互是禁用使用新的块调用的持续时间动画。您可以通过传递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];
}发布于 2010-07-13 23:07:19
对于animateWithDuration:,类引用没有提到任何关于线程的内容,所以我不确定。
对于beginAnimations:context: and commitAnimation:,是的,它们在单独的线程UIView class Reference中运行。
可以对视图对象的某些属性更改进行动画处理,例如,设置边框、边界、中心和变换属性。如果在动画块中更改这些属性,则会以动画形式显示从当前状态到新状态的更改。调用beginAnimations:context: class方法开始动画块,设置要设置动画的属性,然后调用commitAnimations类方法结束动画块。动画在单独的线程中运行,并在应用程序返回运行循环时开始。其他动画类方法允许您控制块中动画的开始时间、持续时间、延迟和曲线。
https://stackoverflow.com/questions/3237431
复制相似问题