UIViewAnimationOptionRepeat完成?

时间:2013-10-20 16:25:58

标签: ios objective-c animation uiview

我正在做一个非常简单的重复动画来淡入和淡出标签,如下所示。我假设每次动画结束时都会调用完成块,但是当使用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");

        }];

2 个答案:

答案 0 :(得分: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选项,但我认为它可以正常工作。

我希望这会对你有所帮助。

答案 1 :(得分:0)

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

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