如何优化UIView Transition Animation?

时间:2013-09-01 22:54:50

标签: ios objective-c uiview uiviewanimationtransition

我正在使用以下代码在视图之间转换:

// 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的平稳性 我怎样才能使这种转变尽可能顺利?

2 个答案:

答案 0 :(得分:1)

您的20个子视图的滚动视图是导致您出现问题的原因。虽然我必须看到代码本身来证明这一点,但是当我尝试创建一个包含许多子视图的滚动视图时,同样的问题发生在我身上,最终结果与UITableView的行为类似(记住{{1} }是UITableView)的子类。 注意:证明这是原因很简单..只需删除UIScrollView的20个子视图然后运行你的动画..如果滞后消失,那么这就足够了。

请注意UIScrollView可能有数千行..但它的设计方式是重用不再出现在屏幕上的单元格(即从池中回收视图,而不是每次都创建新视图需要)。换句话说,它不能在内存中保留比屏幕显示更多的行,否则它将变得迟钝。

请回到滚动视图,其中包含20个子视图,并想办法以某种方式仅使用屏幕上显示的子视图,而不是每次都取消分配和分配新的子视图,以同样的方式重用它们UITableView确实。

请查看interesting post如何在幕后实际创建UITableView ..我相信它会为您提供有关如何优化自己UITableView的想法以避免滞后。

<强>更新 根据您在评论中查看hiarchy的详细信息..这就是我要做的事情

  1. 我会进行转换,但只显示n个数量 适合屏幕的scrollview(即您的情况下为7).. UIImageViews 完成块处理程序,我将添加其余的视图
  2. 如果上述内容不够,我还会将图像加载到UIAnimation完成处理程序的视图中。
  3. 如果上述情况不够......我还会将2个UIButtons和2个UILabel附加到完成处理程序中的子视图中。
  4. 你在这看到一个模式吗?这个想法是一个集中的试验和错误:从转换中逐个删除最昂贵的操作,并在转换完成后放置它。或者,你可以用填充物替换已被推回到动画末尾的UIViews(即想象一个占位符用于图像,一个微调器等。这些替换的选择实际上取决于UX原则以及你认为美学上的东西令用户满意)

答案 1 :(得分:0)

您应该运行Instruments.app并查看占用CPU时间的内容。减少这一点也可以减少口吃并帮助平滑你的动画。