0

我已经在 iphone 应用程序上工作了几个星期。现在我遇到了一个我不知道如何解决的动画问题。也许你可以帮忙。这是细节(有点长,请耐心等待):

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

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

    [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:1.0]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(loadingViewInserted:finished:context:)]; // 使用一个非常高的索引号,所以它总是在顶部 [self.view insertSubview:loadingViewController.view atIndex:1000];

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

  3. 计算完成后,许多结果视图(如棋盘上的棋子)会在加载视图下呈现。

    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];
        }
    }
    
  4. 添加所有结果视图后,将调用以下动画来删除加载视图:

    [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];
    

通过这样做,大多数时候(可能 90%)它完全符合我的要求。但是,有时我会看到一些奇怪的结果:加载视图首先按预期显示,然后在它消失之前,一些假设在加载视图下方的结果视图突然出现在加载视图的顶部;其中一些是部分渲染的。然后加载视图卷曲起来,一切看起来又正常了。奇怪的情况只持续了不到一秒钟,但已经糟糕到把 UI 搞砸了。

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

在这一点上,我真的认为这是iphone(我用OS 3.0编译它)操作系统中的一个错误。或者也许你可以指出我做错了什么(或者可以做不同的事情)。

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

4

1 回答 1

1

AddSubview 应该在其对等视图之上添加子视图。你可能想要 insertSubview:belowSubview:

I'd guess that it "works" sometimes because the computation is stalling the animation, due to CPU contention.

于 2010-05-29T16:14:33.437 回答