0

我正在做一个非常简单的重复动画来淡入淡出标签,如下所示。我假设每次动画完成时都会调用完成块,但是在使用UIViewAnimationOptionRepeat它时永远不会调用它。那么我应该如何停止这个动画呢?

我知道我可以使用[self.lbl.layer removeAllAnimations];,但是它很快就结束了。我想知道它什么时候完成了一个动画循环,这样我就可以在那个时候停止它。

[UIView animateWithDuration:1.0 delay:0 options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveEaseInOut animations:^{
            self.lbl.alpha = 0;

        } completion:^(BOOL finished){
            if (finished) NSLog(@"done");

        }];
4

3 回答 3

3

如果你想让UIViewAnimationOptionRepeat选项的动画是有限的,你必须通过UIView 的+ (void)setAnimationRepeatCount:(float)repeatCount来设置重复次数。

如果是基于块的动画(即您的情况),您应该在动画块内设置重复计数。所以,这里是你的代码修改:

[UIView animateWithDuration:1.0 delay:0 options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveEaseInOut animations:^{
        [UIView setAnimationRepeatCount:4]; // 4 as example here
        self.lbl.alpha = 0;

    } completion:^(BOOL finished){
        if (finished) NSLog(@"done");

    }];

setAnimationRepeatCount:这在UIView 方法的 文档中有所提及。

于 2015-08-27T21:19:07.797 回答
1

也许这种使用选择器的解决方案可以帮助您:

- (void) animateTextWithMax:(NSNumber *)max current:(NSNumber *)current
{
    NSLog(@"max = %d, current = %d",max.intValue, current.intValue);
    textlabel.alpha = 1.0f;
    [UIView animateWithDuration:1.0f delay:0 options:UIViewAnimationOptionAutoreverse
                     animations:^{
                         textlabel.alpha = 0.0f;
                     }completion:^(BOOL finished){
                         NSLog(@"finished");
                         if (current.intValue < max.intValue) {
                             [self performSelector:@selector(animateTextWithMax:current:) withObject:max withObject:[NSNumber numberWithInteger:(current.intValue+1)]];
                         }

                     }];
}

那么你可以通过这种方式调用动画:

[self animateTextWithMax:[NSNumber numberWithInt:3] current:[NSNumber numberWithInt:0]];

也许这不是最好的解决方案,因为您没有使用该UIViewAnimationOptionRepeat选项,但我认为它可以工作。

我希望这可以帮助你。

于 2013-10-20T17:09:59.670 回答
0

正如您所发现的,没有调用完成块,因为动画永远不会结束。在我的脑海中,你有两个选择:

  • 使用选项将另一个动画添加到标签,将其设置为所需的最终值UIViewAnimationOptionBeginFromCurrentState。不过,我不确定这对现有的重复动画有什么影响。如果这不起作用...
  • 通过检查来获取动画的当前位置label.layer.presentationLayer。停止所有动画,将您的值设置为当前状态,然后添加一个新动画以从当前状态过渡到所需的最终状态。
于 2013-10-20T17:00:28.083 回答