2012-12-31 39 views
0

我试图使用自动布局在屏幕上和屏幕上动画我的ADBannerView。预先自动布局(设置框架和动画)一切正常。现在我有以下代码,它在viewDidLoad上运行,以确保广告横幅离开屏幕。动画约束更改layoutIfNeeded慢

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

此代码工作,但它是layoutIfNeeded需要很长时间(相对)并导致较差的性能。删除线条使得一切都变得更加快速,但动画不起作用。

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

编辑:我的UI是相当显著,我认为奠定了一切可能的原因,所以我试图创建一个简单的UIView,并把我的旗帜在那里作为subview,那么我只需要调用layoutIfNeededsubview其中有1项。虽然性能没有变化。

回答

3

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

作为一种解决方法,我首先将广告标语从屏幕上移开,然后只在获取有效广告时在屏幕上移动。虽然在故事板中使用起来更麻烦一些,但用户不会注意到它的差异,并且可以防止放慢速度。

编辑:我一直在更多的自动布局工作,我得到了一个不幸的结论,我似乎与马特诺伊堡分享。在位,他写了题为“auto layout slow on iOS”他说:

这是一个遗憾,但自动布局缓慢iOS上。

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

现在,我想我会避免自动布局任何足够复杂的自动布局有用。

编辑:iOS 8是在测试版和约束得到明显加快。特别是在较老的设备上使用很多(50+),但从目前为止的测试中,我以前的2秒延迟已经减少到约0.4秒。随着这种变化,约束条件可能已经加快到足以实现一些约束繁重的视图工作。

+0

感谢您连接到Matt的帖子。出于同样的原因,我放弃了自动布局。太慢了。 – charshep

1

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

+0

您有权更改动画块中的约束。我把它搬出来,但根本没有效果。我调用动画块“viewDidLoad”的原因很简单,因为它与ADBannerView加载失败时调用的方法相同。我试着将它移到'viewDidAppear'并且行为是相同的。 – DBD

+0

如果对ADBannerView没有任何经验 - 是从服务器下载的吗?当然,我从来没有见过类似动画制约因素时发生的放缓。 – rdelmar

+0

是的,广告横幅从服务器上下载。他们有一个基本上是“成功”和“失败”的委托方法。失败,您可以制作广告。成功你动画它。我想我的下一个测试将试图用一个简单的'UIView'动画。它可能是导致约束动画放缓的'AdBannerView'本身吗? (我的其他约束没有任何动画问题)。 – DBD