取消一个 UIView 动画块

3
下面的代码展示了一个标签的动画,该标签包含用户的状态信息。如果发生某个事件,标签会显示提示,然后通过UIView动画块缓慢消失。
- (void)showStatusOnLabelWithString:(NSString *)statusMessage
{   
    // [self.view.layer removeAllAnimations]; // not working
    [labelStatus.layer removeAllAnimations]; // not working, too

    [labelStatus setText:statusMessage];
    [labelStatus setHidden:NO];
    [labelStatus setAlpha:1.0];

    [UIView animateWithDuration:5.0 animations:^
     {
         [labelStatus setAlpha:0.0];

     } completion:^(BOOL finished) 
     {
         [labelStatus setHidden:YES];
         [labelStatus setAlpha:1.0];
     }];
}

如果第一个事件后的5秒内有另一个事件,则标签应该重新进行动画,因此我使用[self.view.layer removeAllAnimations]删除了先前的动画(我认为是这样)。但是标签完全消失了,接下来的5秒中标签再次变得不可见。
如果我(或用户)等待5秒,一切都可以正常工作。
为什么没有效果?
此致, $h@rky
2个回答

6

把这个改成:

completion:^(BOOL finished) 
 {
     [labelStatus setHidden:YES];
     [labelStatus setAlpha:1.0];
 }];

转换为:

completion:^(BOOL finished) 
 {
     if (finished) {
         [labelStatus setHidden:YES];
         [labelStatus setAlpha:1.0];
     }
 }];

原因是您在删除该层的动画时会进入此完成块,但由于您已中断它,因此“finished”将为“false”。此外,顺序在这里很重要。也许您期望 removeAllAnimations 立即调用完成块,但实际上它将在 showStatusOnLabelWithString:方法完成后调用,所以正在发生的是您先调用 setHidden:NO ,然后立即跟随 setHidden:YES

1
太棒了,这很有效。关于“finished”变量,我学到了新的东西^^ - Sharky

0
你尝试过从标签层(labelStatus.layer)中移除动画吗?

是的,我试过了,但结果一样。我更新了我的问题并添加了你的答案。 - Sharky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接