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 动画在设备上滞后的主要内容,如果未能解决你的问题,请参考以下文章