可能的iPhone动画定时/渲染错误?

时间:2010-05-29 15:40:08

标签: iphone animation uiview timing

我已经在iphone应用程序上工作了几个星期。现在我遇到一个动画问题,我无法弄清楚如何解决。 Mayhbe你可以帮忙。这是详细信息(有点长,请耐心等待):

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

  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];
    
  5. 通过这样做,大部分时间(可能是90%)它完全符合我的要求。但是,有时我看到一些奇怪的结果:加载视图首先按预期显示,然后在它消失之前,一些结果视图(假设在加载视图下)突然出现在加载视图的顶部;其中一些是部分渲染的。然后加载视图蜷缩起来,一切看起来都正常了。奇怪的情况只持续不到一秒钟,但已经足够糟糕,搞砸了UI。

    我尝试了所有不同类型的东西来修复它(使用另一个线程来移除加载视图,使加载视图不透明),但它们都不起作用。唯一能做得更好的是,我先隐藏所有结果视图;在最后一个动画完成后,在其回调中,取消隐藏所有结果视图。但这会失去很好的效果,当卷曲加载视图时,结果已经存在。

    此时,我真的认为这是iphone中的一个错误(我用OS 3.0编译)OS。或者也许你可以指出我做错了什么(或者可以做些不同的事情)。

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

1 个答案:

答案 0 :(得分:1)

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

我猜它有时“有效”,因为由于CPU争用,计算会停止动画。