使用 UIView 动画后应用程序变慢

Posted

技术标签:

【中文标题】使用 UIView 动画后应用程序变慢【英文标题】:App slowness after using UIView Animations 【发布时间】:2013-06-20 19:40:03 【问题描述】:

所以我有一个应用程序,一旦应用程序打开,我就会为它的一些 UI 元素设置动画。这些动画是使用简单的 UIView 动画完成的。下面是 viewDidLoad 部分的示例

    //animate settings in the frame
    CGRect settingsFrame = settingsView.frame;
    settingsFrame.origin.x = -104;
    settingsFrame.origin.y = 457;
    settingsView.frame = settingsFrame;

    //animate about in the frame
    CGRect aboutFrame = aboutView.frame;
    aboutFrame.origin.x = -104;
    aboutFrame.origin.y = 457;
    aboutView.frame = aboutFrame;

这里是调用的相应方法部分。

CGRect settingsFrame = settingsView.frame;
settingsFrame.origin.x = 0; // new x coordinate
settingsFrame.origin.y = 457; // new y coordinate
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration: 1];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
settingsView.frame = settingsFrame;

CGRect aboutFrame = aboutView.frame;
aboutFrame.origin.x = 104; // new x coordinate
aboutFrame.origin.y = 457; // new y coordinate
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration: 1];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
aboutView.frame = aboutFrame;

还有 4 组匹配的代码来完成动画。我的问题是,每当启用 viewDidLoad 部分(未注释掉)时,它都会减慢我的应用程序中向 xib 的其他转换。你们知道我如何保持这些动画但没有缓慢的过渡吗?

除此之外,我应该说这是在 ios 7 和 Xcode 5 开发者预览版上开发的,所以我不排除存在错误...

【问题讨论】:

如果它们都具有相同的持续时间和相同的动画曲线,您为什么要在单独的动画“块”中执行它们? 因为每个块去到一个稍微不同的地方。没有每个块,我无法使其正常运行。你知道让它工作的方法吗? 为所有内容设置初始位置。然后使用UIView animate: with... 做动画。如果您在讨论代码中的不同点,则使用多个动画块(但它们可能在后台同时工作,从而导致“缓慢”)。根据我的经验,在单个动画调用中执行所有并发动画效果最流畅,如果您能找到这样做的方法。 【参考方案1】:

您忘记在动画块的末尾添加 commitAnimations... 执行以下操作,您的问题将得到解决。

CGRect settingsFrame = settingsView.frame;
settingsFrame.origin.x = 0; // new x coordinate
settingsFrame.origin.y = 457; // new y coordinate
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration: 1];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
settingsView.frame = settingsFrame;
**[UIView commitAnimations];**

CGRect aboutFrame = aboutView.frame;
aboutFrame.origin.x = 104; // new x coordinate
aboutFrame.origin.y = 457; // new y coordinate
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration: 1];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
aboutView.frame = aboutFrame;
**[UIView commitAnimations];**

【讨论】:

以上是关于使用 UIView 动画后应用程序变慢的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 中的 UIView 动画在重新加载数据后不起作用

将 CALayer 更改应用到 UIView

为啥我在使用这个 UIView 动画块时会看到生涩的动画?

UIVIew 块动画后用户交互中断

如何在完成前中断 UIView 动画?

即使应用程序处于后台,也可以为 UiView 设置动画