我已经在iphone应用程序上工作了几个星期。现在我遇到一个动画问题,我无法弄清楚如何解决。 Mayhbe你可以帮忙。这是详细信息(有点长,请耐心等待):
基本上我想要实现的效果是,当用户点击一个按钮时,弹出一个加载视图,隐藏整个屏幕;然后应用程序执行了大量繁重的计算,这需要几秒钟。计算完成后,在加载视图下呈现soem结果视图(像棋盘上的棋子一样)。渲染完所有结果视图后,我使用动画动画删除加载视图n并向用户显示结果视图。 这是我的工作:
当用户点击按钮时,运行以下代码:
[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编译)OS。或者也许你可以指出我做错了什么(或者可以做些不同的事情)。
(感谢完成这篇长篇文章,:-))
答案 0 :(得分:1)
AddSubview应该在其对等视图之上添加子视图。你可能想要insertSubview:belowSubview:
我猜它有时“有效”,因为由于CPU争用,计算会停止动画。