我已经在 iphone 应用程序上工作了几个星期。现在我遇到了一个我不知道如何解决的动画问题。也许你可以帮忙。这是细节(有点长,请耐心等待):
基本上我想要达到的效果是,当用户点击一个按钮时,会弹出一个加载视图,隐藏整个屏幕;然后应用程序会进行大量繁重的计算,这需要几秒钟。计算完成后,soem 结果视图(类似于棋盘上的棋子)会在加载视图下呈现。渲染完所有结果视图后,我使用动画动画来移除加载视图并将结果视图显示给用户。这是我所做的:
当用户单击按钮时,运行以下代码:
[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];
在“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]; } }
添加所有结果视图后,将调用以下动画来删除加载视图:
[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编译它)操作系统中的一个错误。或者也许你可以指出我做错了什么(或者可以做不同的事情)。
(感谢您完成这篇长篇文章,:-))