【问题标题】:Stopping animateWithDuration before completion在完成前停止 animateWithDuration
【发布时间】:2014-08-12 05:37:19
【问题描述】:

我在UIViewController 中有这个方法来显示一条消息三秒钟然后淡出。 mainMessageLabel 是在接口文件中声明的UILabel。

- (void) showTempMessage: (NSString*) message
{
    _mainMessageLabel.text = message;
    _mainMessageLabel.alpha = 1;

    [UIView animateWithDuration: 1
                          delay: 3
                        options: 0
                     animations: ^{
                         _mainMessageLabel.alpha = 0;
                     }
                     completion: ^(BOOL finished) {
                         _mainMessageLabel.text = @"";
                         _mainMessageLabel.alpha = 1;
                     }];
}

如果我在上一次调用后至少四秒钟调用该方法,则该方法可以正常工作,但如果我更早调用它,当前一个实例仍在动画时,标签会消失,我必须再等四秒钟才能调用它再次开始工作。每次调用这个方法时,我希望它停止之前的动画并显示新消息三秒钟并淡出。

我在这里尝试了其他问题的答案,例如将UIViewAnimationOptionBeginFromCurrentState添加到options:,甚至将[_mainMessageLabel.layer removeAllAnimations]添加到我的函数顶部,但没有任何效果。你有什么建议吗?

【问题讨论】:

    标签: ios objective-c uiview core-animation


    【解决方案1】:

    问题在于完成块的时间(它在取消先前动画并重置标签的代码之后触发)。简单的解决方案是完全消除该完成块(将其保留为零与将text 设置为@"" 并使其“可见”没有区别)。因此:

    _mainMessageLabel.text = message;
    _mainMessageLabel.alpha = 1.0;
    
    [UIView animateWithDuration:1 delay:3 options:0 animations:^{
        _mainMessageLabel.alpha = 0.0;
    } completion:nil];
    

    【讨论】:

    • 我使用您删除完成块的第一种方法让它工作,但没有 beginFromCurrentState。
    • 同意。鉴于动画的性质,从当前状态开始是不相关的(在 iOS 8 中,我们不会再使用“从当前状态开始”了,无论如何)。我实际上也将删除第二种方法的怪物,因为担心有人可能会将其放入他们的生产代码中!
    【解决方案2】:

    这样试试

    - (void) showTempMessage: (NSString*) message
    {
        _mainMessageLabel.text = message;
        _mainMessageLabel.alpha = 1;
    
       [UIView animateWithDuration: 3
                              delay: 0
                            options: 0
                         animations: ^{
                             _mainMessageLabel.alpha = 1;
                         }
                         completion: ^(BOOL finished)
                         {
                             _mainMessageLabel.text = @"";
                             _mainMessageLabel.alpha = 0;
                         }];
    }
    

    【讨论】:

      【解决方案3】:

      只需将您的代码替换为:

      -(void) showTempMessage: (NSString*) message
      {
      
          _mainMessageLabel.text = message;
          _mainMessageLabel.alpha = 1;
      
          [UIView animateWithDuration: 1
                                delay: 3
                              options: 0
                           animations: ^{
                               _mainMessageLabel.alpha = 0;
                           }
                           completion: ^(BOOL finished) {
                           }];
      }
      

      从哪里调用这个函数只需在此之前添加以下行。

              [_mainMessageLabel.layer removeAllAnimations];
      

      【讨论】:

        【解决方案4】:

        发生这种情况是因为您的 UIview 动画在块中执行,并且由于块函数在不同的线程中执行,您无法在主线程中停止它。

        How to fadein and fadeout in single UIView?

        你可以看看这个以寻找另一种制作动画的方式。这将帮助您随意停止和启动动画。

        【讨论】:

          猜你喜欢
          • 2016-07-11
          • 2011-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-05
          • 1970-01-01
          相关资源
          最近更新 更多