动画约束更改layoutIfNeeded慢

时间:2012-12-31 00:42:07

标签: ios ios6 uiviewanimation autolayout

我正在尝试使用自动布局为我的ADBannerView开启和关闭屏幕设置动画。预自动布局(设置框架和动画)一切正常。现在我有以下代码,它在viewDidLoad上运行,以确保广告横幅在屏幕外。

[UIView animateWithDuration:kADAnimationDuration
                 animations:^{
                     _addBannerDistanceFromBottomConstraint.constant = 32;
                     [self.view layoutIfNeeded];    
}];

此代码有效,但layoutIfNeeded花了很长时间(相对)并导致性能不佳。删除行会使一切变得美观和快速,但动画不起作用。

问题是......为什么这么慢/如何加快速度呢?

编辑:我的用户界面非常重要,我认为所有内容都可能是原因所在,所以我尝试创建一个简单的UIView并将我的横幅放在那里{{1然后我只需要在subview上调用layoutIfNeeded,其中包含1个项目。虽然性能没有变化。

2 个答案:

答案 0 :(得分:3)

我使用ADBannerView创建了一个应用程序而没有别的。存在同样的问题。我提交给Apple作为一个错误并且“重复”,所以我想这是一个已知的问题。

作为一种解决方法,我从屏幕上的广告横幅开始,只有在我获得有效广告时才会在屏幕上移动。虽然在故事板中使用会稍微烦一些,但用户不会注意到差异,并且可以防止速度变慢。

编辑:我一直在使用汽车布局工作,我得出了一个不幸的结论,我似乎与Matt Neuburg分享。在他写的标题为“auto layout slow on iOS”时,他说:

  

很遗憾,但iOS上的自动布局很慢。

它几乎总结了我将我的一个应用程序转换为自动布局的几个问题。表现根本不存在。 Matt在他的帖子中给出的示例自动布局需要花费5倍的时间来完成相同的任务。

现在,我想我会避免自动布局任何复杂到足以让自动布局变得有用。

编辑 iOS 8处于测试版状态,约束速度明显加快。仍然在使用大量(50+)时,特别是在较旧的设备上,但从测试到目前为止,我得到的前2秒延迟已减少到约0.4秒。通过这种变化,可能已经加快了约束,使其可以用于某些约束性的重视工作。

答案 1 :(得分:1)

一个问题可能是在viewDidLoad中执行此操作,其中尚未设置视图参数,但是,我不知道为什么会使它变慢。您可以在viewDidAppear中尝试它。另外,根据我在WWDC 2012自动布局会话中看到的内容,您应该在动画块之外添加约束(或修改常量),而不是在内部。尝试将其移动到动画块上方。