2011-11-07 46 views
13

在我看来,第一次运行动画(动画UIView的框架,或CALayer的位置等),它是非常不连贯的,并且随后的动画是平滑的。为什么iOS动画首次运行时会变慢?

什么会导致这种情况,有什么办法预先缓存动画?

注意:这个问题与这个问题非常相似:UIImageView animations lag at first run,但UIImages没有被用在我的动画中。

+0

您已经提到,这是[UIImageView的动画滞后在第一次运行]重复(http://stackoverflow.com/questions/ 3382478 /的UIImageView的动画LAG-AT-第一运行)。 – Moshe

+0

的确如此,我做到了。我想这不像我想象的那么重复,因为我没有在动画中处理UIImage。编辑问题的这一部分。 – ryleigh

+0

@ryleigh - 够公平的。这是一个很好的问题,所以有一个upvote。 – Moshe

回答

0

假设您使用的是[UIImage imageNamed: @"herp.png"],图像将被缓存。如果图像被大量绘制,它将被解压缩到内存中,否则会对图像执行延迟加载并造成口吃。

+0

我所关心的动画并未使用UIImages,但这很好理解。具体来说,在一个例子中,我从它的父项中移除一个UITextView,将它添加到另一个视图,并使用'[UIView animate ...]'为其框架设置动画。 它第一次运行时会出现断断续续的情况,并且在它恢复原始视图并且动画再次触发后,就会顺利进行。 – ryleigh

+0

这包括渲染任何项目。如果文本从未编辑过,则只需渲染一次。这可能仍然会导致您的问题。但是,在阅读完其他文章后,弹出式键盘很可能与您的键盘有关。 – Nico

0

运行它在viewDidAppear,而不是viewWillAppear。在图像确实出现后应该会发生缓存,并且它看起来应该与用户相同。

+0

那么,我正在处理的动画是对用户输入的回应,所以当视图出现时我无法正确播放它们。我使用了'viewWillAppear',因为我希望在用户看到它们之前有一些方法可以播放它们(这听起来很愚蠢)。 – ryleigh

+0

奇数。您是使用[UIView beginAnimations]方法还是使用基于块的[UIView animateWithDuration:动画:...]方法?你有哪些动画属性?除了帧之外的任何东西什么样的对象有多少? – Tim

+0

嗯,在一种情况下,我从它的父项中移除一个UITextView,将它添加到另一个视图,并使用[UIView animateWithDurationsEtc ...]为其框架设置动画。虽然在动画播放的同时,键盘被召唤出来,所以我开始怀疑键盘的创建是导致动画在这种情况下结结巴巴的原因。这是否有道理,键盘现在被缓存在某处,以便在下次需要时不必重新创建键盘?如果是这样,有什么方法可以预先初始化它吗? – ryleigh

2

如果你有一个TextField,我认为这是接收你的用户输入。使用UITextFieldDelegate方法Did而不是Should

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
//Do textfield animations and other view animations here

}

不要做你的动画中;

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
//Don't do textfield animations and other view animations here
//This is where the system does its own animations; raising the keyboard, etc
}

+0

你的建议的技术原因是什么?为什么动画不能在“应该”中顺利运行? –

相关问题