removeAllAnimations不能连续调用动画

时间:2012-09-25 05:23:20

标签: objective-c xcode core-animation

我正在尝试设置一个图像库类型视图,其中图像几乎全屏,导航控制器,工具栏,按钮(在图像之间移动)和滑块(在图像之间快速移动)都淡出在没有互动的时期之后,然后在水龙头上返回。到目前为止我所拥有的(我确信它甚至没有接近正确的方式,我是一个初学者)是这样的:

-(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 stopFadeOut]; 同     [self performSelector:@selector(stopFadeOut)withObject:nil afterDelay:2];

但结果是一样的。如果永远不会调用stopFadeOut,则行为完全相同,因此我可以得出的唯一结论是,无论出于何种原因,removeAllAnimations调用都不起作用。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

发生了什么

听起来像在上一次运行结束前多次调用reset方法。您可以通过向tap和reset方法添加log-statements来轻松验证这一点,并计算每种方法的日志数量,并观察连续多次点击时会发生什么。

我试图用下面的图画说明问题。

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:之类的内容来取消所有计划的重置方法。