removeAllAnimations 不适用于连续调用的动画
Posted
技术标签:
【中文标题】removeAllAnimations 不适用于连续调用的动画【英文标题】:removeAllAnimations not working on successively called animations 【发布时间】:2012-09-25 05:23:19 【问题描述】:我正在尝试设置图像几乎全屏显示的图像库类型视图,并且导航控制器、工具栏、按钮(用于在图像之间移动)和滑块(用于在图像之间快速移动)都淡出在没有互动的时期之后,然后点击返回。到目前为止我所拥有的(我敢肯定这甚至还没有接近正确的方法,我是一个初学者)是这样的:
-(void)fadeOutViews
[self fadeOutView:rightButton];
[self fadeOutView:leftButton];
[self fadeOutView:mySlider];
mySlider.enabled = NO;
[self fadeOutView:myToolbar];
[self fadeOutView:self.navigationController.navigationBar];
-(void)fadeOutView:(UIView *)view
view.alpha = 1;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:2];
view.alpha = 0;
[UIView commitAnimations];
-(void)stopFadeOut
[rightButton.layer removeAllAnimations];
[leftButton.layer removeAllAnimations];
[mySlider.layer removeAllAnimations];
[myToolbar.layer removeAllAnimations];
[self.navigationController.navigationBar.layer removeAllAnimations];
-(void)resetToInitialConfigurationWithDelay:(int)delay
if (buttonWasPressed)
delay = 4;
buttonWasPressed = NO;
rightButton.alpha = 1;
leftButton.alpha = 1;
mySlider.alpha = 1;
myToolbar.alpha = 1;
self.navigationController.navigationBar.alpha = 1;
mySlider.enabled = YES;
[self stopFadeOut];
[self performSelector:@selector(fadeOutViews) withObject:nil afterDelay:delay];
所以,理论上,你重置到初始状态(延迟是因为使用按钮前进时图像淡入淡出,所以在按下按钮后需要更多时间才能淡出,否则新图像加载后立即开始淡入淡出。这会将所有内容重置为其开始的方式,并再次开始淡入淡出过程。如果发生应该停止淡入淡出过程的事情,stopFadeOut 会删除所有动画。例如,如果点击发生:
- (IBAction)tapOccurs:(id)sender
[self stopFadeOut];
[self resetToInitialConfigurationWithDelay:2];
任何先前的动画都停止,然后重新启动该过程。或者至少这是理论。在实践中,如果连续快速点击几次,淡出的视图将开始短暂淡出,然后一遍又一遍地重置,以使它们看起来像是在闪烁,直到它们最终完全淡出。我认为问题可能是动画被延迟了,但是 removeAllAnimation 调用没有,所以我替换了 [自停止淡出]; 和 [self performSelector:@selector(stopFadeOut) withObject:nil afterDelay:2];
但结果是一样的。如果从不调用 stopFadeOut,则行为完全相同,所以我可以得出的唯一结论是,无论出于何种原因,removeAllAnimations 调用都不起作用。有什么想法吗?
【问题讨论】:
【参考方案1】:发生了什么
在我看来,在上一次运行完成之前多次调用了 reset 方法。您可以通过在 tap 和 reset 方法中添加日志语句来轻松验证这一点,并计算每种方法的日志数量,并观察当您连续多次点击时会发生什么。
我试图用下图来说明问题。
T = tapOccurs:
O = fadeOutViews:
--- = wait between T & O
Normal single tap
T-----O T-----O
---------------------> time
Multiple taps in a row
T-----O
T-----O
T-----O
---------------------> time
What it sound like you are trying to do
T-
T---
T-----O
---------------------> time
每次调用fadeOutViews:
(图中称为O
)时,视图都会淡出。查看您的 fadeOutView: 实现,这意味着不透明度将跳转到 1,然后慢慢淡化到 0,因此看起来它们闪烁的次数与点击次数相同,直到最终重新开始。
如何防止这种情况发生
您可以做很多事情来阻止这种情况的发生。一件事是通过调用cancelPerformSelectorsWithTarget:
或cancelPreviousPerformRequestsWithTarget:selector:object:
之类的方法来取消所有预定的重置方法。
【讨论】:
cancelPreviousPerformRequestsWithTarget:完美运行!谢谢。以上是关于removeAllAnimations 不适用于连续调用的动画的主要内容,如果未能解决你的问题,请参考以下文章
[layer removeAllAnimations] 调用时如何让动画视图停留在当前位置