UIView 动画在设备上滞后

Posted

技术标签:

【中文标题】UIView 动画在设备上滞后【英文标题】:UIView animation lags on device 【发布时间】:2012-05-15 07:23:06 【问题描述】:

我在我的应用程序中使用动画并感到困惑,因为动画在设备上滞后,在模拟器上一切似乎都很好。首先我尝试使用

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

在提交动画之前,有大约 30 行带有“if”块的代码,所以我认为这可能会导致问题,但后来我开始使用

[UIView animateWithDuration:0.3
                                  delay:0.0
                                options: UIViewAnimationCurveEaseIn
                             animations:^
                                 mainView.frame = CGRectMake(0, 0, 320, 420);
                                 buttonsView.transform = CGAffineTransformMakeTranslation(0, 68);
                                 radioBar.transform = CGAffineTransformMakeTranslation(0, -50);
                                 vk_controller.view.frame = CGRectMake(0, 0, 320, 440);
                              
                             completion:^(BOOL finished)
                                 button.isHiddenDown = YES;
                             ];

就“if”块而言,但滞后似乎仍然存在。当我按下按钮时,会有约 0.5-1 秒的延迟(为什么?),然后动画开始。但是当我在表格视图中时

[UIView animateWithDuration:0.3
                                  delay:0.0
                                options: UIViewAnimationCurveEaseIn
                             animations:^
                                 mainView.frame = CGRectMake(0, 0, 320, 420);
                                 buttonsView.transform = CGAffineTransformMakeTranslation(0, 68);
                                 radioBar.transform = CGAffineTransformMakeTranslation(0, -50);
                                 goha_news_controller.view.frame = CGRectMake(0, 0, 320, 420);
                                 goha_news_controller.feed_table.frame = CGRectMake(0, 0, 320, 420);
                                 if(goha_news_controller.backgroundView)
                                 
                                     goha_news_controller.backgroundView.frame = CGRectMake(0, 0, 320, 420);
                                     goha_news_controller.newsDetailView.frame = CGRectMake(0, 0, 320, 420);
                                 

                              
                             completion:^(BOOL finished)
                                 button.isHiddenDown = YES;
                             ];

除了动画前的意外延迟外,还有带有爆裂的刺耳动画。 谁能解释为什么会发生这种情况以及我该如何解决?

【问题讨论】:

你会同时启动多个动画吗?多个动画是指同一方法中的多个 [UIView animate...] ? 不,同时只有1个动画块 我找到了一些确实有多个的代码。为什么这样不好? 【参考方案1】:

另一个可能的原因。您是否在任何屏幕视图或图层中使用阴影? ios 根本无法很好地处理带有阴影的动画。

【讨论】:

是的,在表格视图中,图像视图层上有阴影。我必须删除它吗?当我在没有阴影的视图上提交动画时,没有刺耳的移动,但在按下按钮和动画之间仍有约 0.5-0.8 秒的延迟 哦等等,我对上下条使用阴影,每个视图都必须保留,必须检查它作为问题的原因 是的,你是对的,一切看起来性能都不错,但设计丑陋;] 没有高性能的替代品来制作阴影吗?还是这部分必须由设计师创作?【参考方案2】:

您不能使用模拟器来衡量性能。它具有与设备完全不同(不仅更好或更差)的性能特征(而且设备也因代而异)。

If 语句没有造成明显的延迟;它们非常便宜。

您的性能问题可能出在其他地方。在您向我们展示的代码中,我看不到任何明显的性能问题。

【讨论】:

【参考方案3】:

如果您在动画时调整控件中的图像大小,这可能会导致延迟,因为图像大小调整对 CPU 来说是一个非常昂贵的过程。在运行动画和更改图像之前,您应该制作图像的缩略图。

另外,尝试使用开始动画 - 提交动画而不是使用块制作动画。

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.75];
// Here some more animation settings
// Here your animations 
[UIView commitAnimations];

【讨论】:

我同意您关于调整图像大小的帖子。但是,为什么要使用 beginAnimations:context:/commitAnimations?根据我的经验,新的基于块的动画效果非常好,并且通常更清洁且更易于使用。此外,Apple 不鼓励在 iOS 4.0 及更高版本上使用旧样式 @DuncanC 我完全同意,块动画使用起来更加简洁,并且完成块比每次使用 setAnimationDidStopSelector:@(SEL) 创建一个新方法要容易得多 我之前使用了开始动画,但我决定将其替换为 5 个动画块(对于每个视图控制器)以避免在 1 个动画中调整许多帧大小,但这根本没有帮助。我不会精确调整图像的大小,我会调整视图、表格视图的大小并将翻译提交到上下栏

以上是关于UIView 动画在设备上滞后的主要内容,如果未能解决你的问题,请参考以下文章

旋转设备时,动画 uiview 切换回其原始状态

移动浏览器/视图中的按钮“点击”动画滞后

启用 64 位后,Unity 游戏在 Android 设备上滞后

在iOS设备上测试时Unity游戏滞后

为啥这些约束在动画时似乎滞后?

纵向模式下的动画UIView在ios上横向不一致