2

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

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

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

4

1 回答 1

3

怎么了

在我看来,在上一次运行完成之前多次调用了 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:or cancelPreviousPerformRequestsWithTarget:selector:object:

于 2012-09-25T06:55:10.900 回答