在完成之前停止animateWithDuration

时间:2014-08-12 05:37:20

标签: ios objective-c uiview core-animation

我在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]添加到我的函数顶部,但没有任何效果。你有什么建议吗?

4 个答案:

答案 0 :(得分:1)

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

_mainMessageLabel.text = message;
_mainMessageLabel.alpha = 1.0;

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

答案 1 :(得分:0)

试试这个

- (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;
                     }];
}

答案 2 :(得分:0)

只需用以下代码替换您的代码:

-(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];

答案 3 :(得分:0)

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

How to fadein and fadeout in single UIView?

你可以通过另一种方式来做动画。这将帮助您随意停止和开始动画。