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 不适用于连续调用的动画的主要内容,如果未能解决你的问题,请参考以下文章

removeAllAnimations 不起作用后添加动画

Netty系列BIONIOAIO通信差异

[layer removeAllAnimations] 调用时如何让动画视图停留在当前位置

取消 UIView 动画 - self.view.layer removeAllAnimations 不起作用

同步,异步,阻塞,非阻塞,bio,nio,aio

AWS BeanStalk 不倾向于连接到 AWS RDS