为什么iOS动画第一次运行很慢?

13

在我看来,第一次运行动画(如UIView的帧动画或CALayer的位置动画等)时会非常卡顿,而后续的动画则很流畅。

是什么原因导致了这种情况?有没有办法预缓存动画?

注意:这个问题与UIImageView首次运行动画卡顿相似,但我的动画中没有使用UIImages。


你提到这是 UIImageView animations lag at first run 的重复问题。 - Moshe
没错,我确实这样做了。我想这并不像我想的那样是一个重复的问题,因为我的动画中没有涉及到UIImages。我编辑了问题的那一部分。 - ryleigh
@ryleigh - 好的,说得对。这是一个好问题,所以我点了个赞。 - Moshe
3个回答

2
如果您有一个TextField,我假设这是接收用户输入的地方。请使用UITextFieldDelegate方法Did而不是Should。
- (void)textFieldDidBeginEditing:(UITextField *)textField { //在此处执行文本字段动画和其他视图动画 }
不要在以下方法中执行动画;
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { //不要在此处执行文本字段动画和其他视图动画 //这是系统执行自己的动画的地方; 弹出键盘等 }

你的建议的技术原因是什么?为什么动画在“should”中不能流畅运行? - Ed Chin

0
假设您正在使用[UIImage imageNamed: @"herp.png"],则该图像将被缓存。如果该图像被频繁绘制,则会被解压到内存中,否则它将进行惰性加载并导致卡顿。

我关注的动画并不使用UIImages,虽然了解这一点很好。具体来说,在某些情况下,我正在将UITextView从其父视图中移除,添加到另一个视图中,并使用[UIView animate...]来动画化其框架。第一次运行时会出现停顿,而在它回到原始视图并再次触发动画后,它就会变得流畅。 - ryleigh
这包括任何项目的呈现。如果文本从未被编辑过,它只需要被呈现一次。这仍然可能导致你的问题。但是,在阅读了您的其他帖子之后,很可能与您的键盘弹出有关。 - Nico

0

viewDidAppear中运行它,而不是viewWillAppear。缓存应该在图像已经出现后发生,并且对用户来说应该看起来相同。


好的,我正在处理的动画是响应用户输入的,所以我不能在视图出现时立即播放它们。我使用了viewWillAppear,因为我希望有一种方法可以在用户看到它们之前播放它们(这听起来很傻)。 - ryleigh
奇怪。你正在使用[UIView beginAnimations] 方法还是基于块的 [UIView animateWithDuration:animations:...] 方法?你要动画化哪些属性?除了框架之外还有其他的吗?你有多少个什么类型的对象? - Tim
在一个情况下,我正在将UITextView从其父级中删除,添加到另一个视图中,并使用[UIView animateWithDurationsEtc ...]来动画显示其框架。虽然同时播放动画时键盘被唤起,所以我开始怀疑键盘的创建是导致动画在那种情况下出现卡顿的原因。这有意义吗,现在键盘被缓存在某个地方,这样它下次需要时就不必重新创建了吗?如果是这样,有没有预初始化它的方式? - ryleigh
但在另一种情况下,我正在对一个按钮进行动画处理,其中包括:CAGradientLayer的positioncolorsborderColor的隐式动画,CAShapeLayer的backgroundColor的隐式动画以及CAShapeLayer的shadowPath的CABasicAnimation。在这种情况下,卡顿并不是那么明显或干脆 - 但它肯定似乎在动画播放时(长时间未播放后)会出现卡顿,如果反复播放,则是流畅的。就像轮子一样,它正在创建一个好的凹槽以平稳地运行,以强制打个比方。 - ryleigh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接