检测Cocoa动画是否正在进行中(使用BOOL)以防止多个动画同时进行



在我的应用程序中,我运行了许多动画、移动对象和形状等。许多动画都会引出其他对象的动画。该应用程序的一个问题是,如果一个动画正在运行,而您启动了另一个涉及当前正在设置动画的对象的动画,则屏幕将变白/我们会得到意外的结果。

我编写了一些示例代码来展示我们正在尝试做的事情:

UIButton *button;
BOOL currentlyShowingQuestion;
- (void)viewDidLoad
{
    [self moveButton:button];
    currentlyShowingQuestion = NO;
    [NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(hasBoolChanged) userInfo:nil repeats:YES];
}
- (void)moveButton:(UIButton *)buttonToUse {
    currentlyShowingQuestion = YES;
    NSLog(@"moveButton Called!  Yippee!!!!!!!");
    [UIView animateWithDuration:0.5 delay:0.5 options:nil animations:^{
        buttonToUse.frame = CGRectMake(10, 10, 300, 440);
    } completion:^(BOOL finished){
        currentlyShowingQuestion = NO;
    }];
}
-(void)hasBoolChanged {
    if (currentlyShowingQuestion == YES) {
        NSLog(@"Yes");
    }
    else if (currentlyShowingQuestion == NO) {
        NSLog(@"No");
    }
}

我最终看到的是,当方法运行时,currentlyShowingQuestion BOOL都会立即更改,所以它会更改为YES,然后立即返回到NO。然后动画运行。为什么会这样?订单怎么了?

感谢您的帮助。很抱歉代码格式不正确-我搞不懂这里的语法。

提前感谢

Sam

我真的不明白你想要实现什么。在开始时,您启动一个计时器来检查布尔值是否已更改。我认为这项任务有点过头了,但没关系。由于某种原因,动画延迟了0.5秒,然后动画的持续时间为0.5秒,这非常快,因此看起来可以立即更改值。

我对UIView不太熟悉,但根据文档,完成块可能会在动画完成之前调用。在将currentlyShowingQuestion更改为NO之前,请尝试添加一个条件,即是否已完成为YES。

最新更新