我正在做一个非常简单的重复动画来淡入和淡出标签,如下所示。我假设每次动画结束时都会调用完成块,但是当使用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");
}];
答案 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
获取动画的当前位置。停止所有动画,将您的值设置为当前状态,然后添加一个新动画以从当前状态转换到所需的最终状态。