我正在使用以下代码在视图之间转换:
// Populate view2 here
UIView *theWindow = [_view2 superview];
[_view2 removeFromSuperview];
CATransition *animation = [CATransition animation];
[animation setDuration:0.25f];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromRight];
[animation setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[[theWindow layer] addAnimation:animation forKey:@"SwitchToSecondView"];
然而,这有效,过渡并不完全顺利。我在iPhone4设备v5.1.1上进行测试。两个视图都包含一个UINavigationView,UIScrollView有大约20个子视图,我考虑在动画完成后填充视图,但我想尽可能避免这种情况。我会评价过渡7/10的平稳性 我怎样才能使这种转变尽可能顺利?
答案 0 :(得分:1)
您的20个子视图的滚动视图是导致您出现问题的原因。虽然我必须看到代码本身来证明这一点,但是当我尝试创建一个包含许多子视图的滚动视图时,同样的问题发生在我身上,最终结果与UITableView
的行为类似(记住{{1} }是UITableView
)的子类。 注意:证明这是原因很简单..只需删除UIScrollView的20个子视图然后运行你的动画..如果滞后消失,那么这就足够了。
请注意UIScrollView
可能有数千行..但它的设计方式是重用不再出现在屏幕上的单元格(即从池中回收视图,而不是每次都创建新视图需要)。换句话说,它不能在内存中保留比屏幕显示更多的行,否则它将变得迟钝。
请回到滚动视图,其中包含20个子视图,并想办法以某种方式仅使用屏幕上显示的子视图,而不是每次都取消分配和分配新的子视图,以同样的方式重用它们UITableView
确实。
请查看interesting post如何在幕后实际创建UITableView
..我相信它会为您提供有关如何优化自己UITableView
的想法以避免滞后。
<强>更新强> 根据您在评论中查看hiarchy的详细信息..这就是我要做的事情
scrollview
(即您的情况下为7).. UIImageViews
完成块处理程序,我将添加其余的视图你在这看到一个模式吗?这个想法是一个集中的试验和错误:从转换中逐个删除最昂贵的操作,并在转换完成后放置它。或者,你可以用填充物替换已被推回到动画末尾的UIViews(即想象一个占位符用于图像,一个微调器等。这些替换的选择实际上取决于UX原则以及你认为美学上的东西令用户满意)
答案 1 :(得分:0)
您应该运行Instruments.app并查看占用CPU时间的内容。减少这一点也可以减少口吃并帮助平滑你的动画。