dispatch_after和[UIView animation:duration]立即发生(但不应该)

时间:2013-10-01 00:25:47

标签: ios uiview ios7 grand-central-dispatch

对于iOS7,我们遇到了间歇性的错误。 iOS6没有发生这种情况。

它不会马上开始,但游戏中约30秒到2分钟,所有动画和dispatch_after命令都会立即发生。

更具体地说,动画正在发生,好像“duration:”值为0,即使它绝对不是0。 更具体地说,dispatch_after正好像wait = 0一样发生。

一旦启动,它将一直存在,直到软件终止。

我不知道如何调试它,或者它是否是iOS7错误。非常感谢任何/帮助!

3 个答案:

答案 0 :(得分:1)

您认为您的完成块是否过早被调用?

如果是这样,你检查了传递到完成块的布尔值的值吗?如果布尔值为true,您可能只想执行该块中的语句。

e.g。

[UIView animateWithDuration... animations:^{
    //do something
} completion:^(BOOL finished) {
    if (finished) {
        // do something
    }
}];

我在动画开始之前调用完成块时看到了这个,但实际上是因为其他东西取消了动画,因此finished = NO

这不回答有关dispatch_after的问题,因此您可能仍会遇到错误。

答案 1 :(得分:0)

问题标题和描述似乎有所不同(unClear to understand),无论如何你想在一段时间之后产生任务然后看下面

  

dispatch_after和[UIView animation:duration]立即发生

这可行:

// Do your stuff OR animations then use below for DISPATCH_AFTER...
 double delayInSeconds = 2.0f;
            dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
            dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
                // Do your Stuff Or Add Animation
                [UIView animateWithDuration:.6f animations:^{
                    self.tableView.contentOffset = CGPointMake(0, 173);

                }];
            });

答案 2 :(得分:0)

你的问题听起来好像你没有在主线程上调用动画和调度。这会导致意外行为,例如视图在某个时间点之前不会更新或移动。

请尝试在dispatch_main中移动动画块,如下所示:

dispatch_async(dispatch_get_main_queue(), ^{
    <# Code #>
});

并查看它是否解决了问题。