可能的iphone动画计时/渲染错误?

可能的iphone动画计时/渲染错误?,iphone,animation,uiview,timing,Iphone,Animation,Uiview,Timing,几周来,我一直在开发iphone应用程序。现在我遇到了一个动画问题,我不知道该如何解决。也许你能帮忙。以下是细节(有点长,请耐心听我说): 基本上我想要达到的效果是,当用户点击一个按钮时,一个加载视图弹出,隐藏了整个屏幕;然后这些应用程序会进行大量繁重的计算,这需要几秒钟的时间。计算完成后,soem结果视图(类似于棋盘上的棋子)将在加载视图下呈现。渲染完所有结果视图后,我使用动画移除加载视图并向用户显示结果视图。 以下是我的工作: 当用户单击按钮时,运行以下代码: [UIView beginAn

几周来,我一直在开发iphone应用程序。现在我遇到了一个动画问题,我不知道该如何解决。也许你能帮忙。以下是细节(有点长,请耐心听我说):

基本上我想要达到的效果是,当用户点击一个按钮时,一个加载视图弹出,隐藏了整个屏幕;然后这些应用程序会进行大量繁重的计算,这需要几秒钟的时间。计算完成后,soem结果视图(类似于棋盘上的棋子)将在加载视图下呈现。渲染完所有结果视图后,我使用动画移除加载视图并向用户显示结果视图。 以下是我的工作:

  • 当用户单击按钮时,运行以下代码:

    [UIView beginAnimations:nil上下文:nil]; [UIView setAnimationDuration:1.0]; [UIView setAnimationBeginsFromCurrentState:是]; [UIView-setAnimationTransition:UIViewAnimationTransitionUrlDown-forView:self.view缓存:是]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(loadingViewInserted:finished:context:)]; //使用一个非常高的索引号,以便它始终位于顶部 [self.view insertSubview:loadingViewController.view-atIndex:1000]

    [UIView commitAnimations];
    
  • 在“loadingViewInserted”函数中,它调用另一个函数来完成繁重的计算工作

  • 计算完成后,许多结果视图(如棋盘上的棋子)将在加载视图下渲染

    for(int colIndex = 1; colIndex <= result.columns; colIndex++) {
        for(int rowIndex = 1; rowIndex <= result.rows; rowIndex++) {
            ResultView *rv = [ResultView resultViewWithData:results[colIndex][rowIndex]];
                [self.view addSubview:rv];
        }
    }
    
  • 通过这样做,大部分时间(可能90%)它都能完全满足我的需求。然而,有时我会看到一些奇怪的结果:加载视图如预期的那样首先出现,然后在它消失之前,一些结果视图(假设在加载视图下)突然出现在加载视图的顶部;其中一些是部分渲染的。然后加载视图卷起,一切看起来又正常了。这种奇怪的情况只持续了不到一秒钟,但已经糟糕到足以破坏用户界面

    我尝试了各种各样的方法来解决这个问题(使用另一个线程删除加载视图,使加载视图不透明),但没有一种方法有效。唯一能稍微好一点的是,我先隐藏所有的结果视图;最后一个动画完成后,在其回调中,取消隐藏所有结果视图。但是这样就失去了一个很好的效果,即当卷曲加载视图时,结果已经存在了

    在这一点上,我真的认为这是iphone(我用OS3.0编译)操作系统中的一个bug。或者你可以指出我做错了什么(或者可以做得不同)


    (感谢您完成这篇长篇文章,:-)

    AddSubview应该将子视图添加到其对等视图的顶部。您可能需要insertSubview:belowSubview:


    我猜它有时“起作用”,因为CPU争用导致计算暂停动画。

    是的,这正是问题所在。我想了想,但被它在某个时候起作用的事实弄糊涂了。我加了一个“bringSubViewTOFront”电话,现在一切都好了。谢谢
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
    [loadingViewController.view removeFromSuperview];
    
    [UIView commitAnimations];