iOS如何判断一个视图是否正在进行动画?

3

我正在尝试对一个UILabel进行动画处理(淡入/淡出),并使用以下代码:

float newAlpha = 0.0;

//TODO:Check if the previous animation has finished

if(answer.alpha==0.0) {
    newAlpha = 1.0;
} else if(answer.alpha==1.0) {
    newAlpha = 0.0;
}
[UIView animateWithDuration:1.0 animations:^{
    answer.alpha = newAlpha;
}];

在TODO注释的位置,我想检查前一个动画是否已经完成,如果没有完成,退出方法。有没有一种方法可以实现这个功能?


可能是重复的问题:如何判断UIView是否在动画中间? - paulmelnikow
3个回答

3

更新 #1:

你的类需要一个变量:

BOOL _animationFinished;

接下来,您可以使用以下方法进行动画:

float newAlpha = 0.0;

//TODO:Check if the previous animation has finished
if (_animationFinished == false) return;

if(answer.alpha==0.0) {
    newAlpha = 1.0;
} else if(answer.alpha==1.0) {
    newAlpha = 0.0;
}

[UIView animateWithDuration:1.0f animations:^{ answer.alpha = newAlpha; _animationFinished = false; } completion:^(BOOL finished){ _animationFinished = true; }];

必须能够正常工作。


原文

我总是像这样检查动画的主题:

float newAlpha = 0.0;

//TODO:Check if the previous animation has finished
if (answer.alpha > 0.f || answer.alpha < 1.f) return; // it is always good enough for me
// ...or with AND it will cause the same effect:
// if (answer.alpha > 0.f && answer.alpha < 1.f) return;

if(answer.alpha==0.0) {
    newAlpha = 1.0;
} else if(answer.alpha==1.0) {
    newAlpha = 0.0;
}
[UIView animateWithDuration:1.0 animations:^{
    answer.alpha = newAlpha;
}];

不错,我没有想到那个解决方案。我会尝试一下,看看它是否有效 :) - Todd Davies
你可以用它,这种方法对我来说完全足够了。希望能有所帮助。 :) - holex
不行,这不起作用。组件的alpha值是通过'answer.alpha = newAlpha'设置的,屏幕上的动画只是追赶上来而已。 - Todd Davies
1
好的,还有另一个解决方案,我正在为您努力解决。 - holex

2
如果您正在使用UIView,则
[UIView setAnimationDidStopSelector:@selector(animationfinished)];
-(void) animationfinished
{
      animationFinished = YES;
}

我仍然认为这是最好的答案。因为动画块仅支持iOS 4.0及以上版本。 - cloosen

1
使用animateWithDuration:animations:completion:方法执行你的“前一个动画”,并在完成处理程序中设置一个标志,指示它是否完成。然后,在TODO注释所在的位置检查相同的标志。 编辑:以下是示例
-(void) animation1 {
    // assume that alpha was 0 and we want the view to appear
    [UIView animateWithDuration:1.0 animations:^{
        answer.alpha = 1.0;
    } completion:^(BOOL finished){
        fristAnimationFinished = finished;
    }];
}

-(void) animation2 {
    float newAlpha = 0.0;

    if (!firstAnimationFinished)
        return;

    if(answer.alpha==0.0) {
        newAlpha = 1.0;
    } else if(answer.alpha==1.0) {
        newAlpha = 0.0;
    }
    [UIView animateWithDuration:1.0 animations:^{
        answer.alpha = newAlpha;
    }];
}

你能给我一些示例代码吗?我的“之前的动画”只是另一个透明度动画 :) - Todd Davies
在 } completion:^{ 这一行,我会收到一个错误提示:“Incompatible block pointer types sending 'void (^)(void)' to a parameter of type 'void (^)(BOOL)” 顺便说一句,我喜欢你的头盔! - Todd Davies
1
现在没问题了,这就是为什么我把方法的链接放在我的答案顶部的原因。 - lawicko
我完全不清楚的是如何将视图的上下文设置为动画,并且它存储在哪里? - Alex Zavatone
所有的事情都发生在 animateWithDuration:animations: 方法中,一些属性 的 UIView 是可动画的,所以在这个特定的情况下,answer.alpha 正在被动画化。 - lawicko

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