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

Posted

技术标签:

【中文标题】检测 Cocoa 动画是不是正在进行(使用 BOOL)以防止同时出现多个动画【英文标题】:Detecting if a Cocoa Animation is in Progress (Using BOOL) to prevent multiple simultaneous animations检测 Cocoa 动画是否正在进行(使用 BOOL)以防止同时出现多个动画 【发布时间】:2012-07-09 09:54:38 【问题描述】:

在我的应用程序中,我运行了大量动画、移动对象和形状等。 许多动画会导致其他对象的动画。 该应用程序的一个问题是,如果一个动画正在运行并且您启动另一个涉及当前动画对象之一的动画,则屏幕会变白/我们会得到意想不到的结果。

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

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");
    

我最终实际看到的就像 currentShowingQuestion BOOL 在方法运行时都会立即更改,因此它会更改为 YES 并立即返回 NO。然后动画运行。为什么是这样?订单有什么问题?

任何帮助表示赞赏。 对代码格式感到抱歉 - 我无法弄清楚这里的语法。

提前致谢,

山姆

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于检测 Cocoa 动画是不是正在进行(使用 BOOL)以防止同时出现多个动画的主要内容,如果未能解决你的问题,请参考以下文章

如何检测文件是不是已使用 Cocoa 重命名?

如何检测 QImage 是不是为动画?

使用 Cocoa 检测正在运行的应用程序何时播放音频

Cocoa File Opened Event - 检测文件是不是被打开

检测属性是不是可以通过 CSS3 过渡设置动画?

检测页面上是不是有动画