0

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

// 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、带有大约 20 个子视图的 UIScrollView,我考虑过在动画完成后填充视图,但如果可能的话我想避免这种情况。我会评价过渡的平滑度 7/10。
我怎样才能使这种过渡尽可能顺利?

4

2 回答 2

1

带有 20 个子视图的滚动视图是导致问题的原因。尽管我必须查看代码本身来证明这一点,但是当我尝试创建具有许多子视图的滚动视图时,我也遇到了同样的问题,最终结果的行为类似于UITableView(记住UITableView是 的子类UIScrollView)。注意:证明这是原因很简单..只需删除 UIScrollView 的 20 个子视图,然后运行您的动画.. 如果滞后消失了,那么这就是充分的证明。

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

所以回到你的带有 20 个子视图的滚动视图,并想办法以某种方式只使用屏幕上显示的子视图,而不是每次都释放和分配新的子视图,而是以同样的方式重用它们UITableView

请看看这个有趣的帖子是如何UITableView在幕后实际创建的。我相信它会给你如何优化你自己的想法scrollview以避免滞后。

更新: 根据您在评论中的视图层次结构的详细信息..这就是我要做的

  1. 我会进行转换,但只显示 UIImageViews适合屏幕的 n 数量(即在您的情况下为 7).. 在UIAnimation 完成块处理程序中,我将添加其余的视图
  2. 如果以上还不够,我也会将图像加载到 UIAnimation 完成处理程序中的视图中。
  3. 如果以上还不够。我还将在完成处理程序中将 2 个 UIButtons 和 2 个 UILabel 附加到子视图。

你在这里看到一个模式吗?这个想法是一个集中的试验和错误:从转换中一个一个地删除最昂贵的操作,并在转换完成后放置它。或者,您可以用填充物(即图像的占位符、微调器等)替换已被推回动画末尾的 UIView。这些替换的选择确实受 UX 原则的影响,并且您认为符合美学要求取悦用户)

于 2013-09-02T03:04:22.807 回答
0

你应该运行 Instruments.app 看看是什么占用了你的 CPU 时间。减少它也将减少口吃并帮助平滑您的动画。

于 2013-09-02T03:02:06.903 回答