Autolayout在iOS 8上工作正常,但在iOS 6和7(我使用XCode 6.2)上performance不佳,

我正在使用自动布局来正确地布局UICollectionViewCell中的一些视图。 它适用于iOS 8,但是当我尝试在iOS 7或iOS 6上运行它时,单元格的外观在每次布局时都会有很大的变化(有时我会发现尺寸和位置的细微变化 – 一个或两个像素 – 有时会变大更改,导致一些相当混乱的单元格)。

我发誓我努力find有同样问题的人,但我不能。 我没有find任何答案可以帮助我解决甚至接近理解这个问题。

我将不胜感激任何关于如何解决甚至更好的debugging的意见。

更多信息

我使用Interface Builder来创build视图并设置约束。 单元格的视图总共有17个子视图,包括UIViews和它们的子视图,并且它们有很多约束条件。

每次按下button,我都会更新一个UIColletionView(包括我自定义的单元格的表格)。

我在这里发现的令人愤慨的是,当我运行应用程序时,每次按下button,单元格的子视图都会改变它们的位置和大小。 我从不改变任何约束或框架编程。

此外,在iOS6上的行为是最糟糕的。 这些框架的变化更大,自动布局运行非常缓慢(即使只有一个单元格,也需要3到10秒才能更新iPod Touch 5th Generation上的集合视图)。

最糟糕的是,如果我不断更新UICollectionView,有时XCode会抱怨约束不能同时满足。 但大多数时候它工作得很好。

我也遇到一些设备崩溃,当从超级视图中删除我的一些自动布局function的视图。 我发现这是Autolayout引擎的一个奇怪的行为,由于浮动错误可能会导致一些错误的计算。 我想知道这两个问题是相关的。

因为在search了几乎整整一天之后,我在整个networking上找不到任何帮助,所以我开始认为这是一个愚蠢的解决scheme的愚蠢的错误。 我确实希望如此。

提前致谢!

SCREENSHOTS

我添加了一些截图来帮助你看到问题。 为了获得这些屏幕截图,我使用iOS 6在iPod Touch第5代上运行应用程序。iPhone 4和iOS 7的行为不同(它performance得好多了,但是我仍然可以看到元素在一些像素周围移动)。

每次我点击“更新”button,我从其超级视图(整个屏幕)中删除包含UICollectionView的视图并重新添加。 我不摧毁这个观点,它只创build一次。 我认为这可能是问题的根源(一些自动布局计算缓冲区保存了之前布局的值),但是破坏它并不能解决问题(尽pipe它确实使得位移不那么频繁和令人不安,但是以性能为代价) 。

这是预期的行为。 这是应用程序打开时的视图:

这是预期的行为。这是我应用程序打开时获得的视图。 错位的意见。 这是第一次按下“更新”button的结果:

错位的意见。这是第一次按下“更新”按钮的结果。 第二次按下button后的结果:

第二次按下按钮后的结果。 第三次按下button后的结果:

第三次按下按钮后的结果。 如果我继续按下button,我会在屏幕截图3和4之间交替布局(或者至less它们看起来很像)。

我给自动退出,这是为什么

那么,我真的放弃使用自动布局。 我花了将近一个星期的时间学习了很多东西(特别是布置和animation视图)。 我认为这是一个奇妙而强大的function,我学会了去爱它。 但是,我需要支持iOS6和iOS7。

我发现它只适用于iOS8(任何设备,旧的或不)。 我不知道我是不是在做一些非常愚蠢的事情,因为我在网上找不到任何线索,谈论我一直面临的三个杀人问题。

我会在这里列出他们,以防万一某些人在将来遇到同样的问题或解决scheme时遇到此线程。 他们是按照我给他们的优先顺序列出的,为什么我放弃了自动布局。

1)性能

Autolayout在iOS6上运行速度非常慢,在iOS7上运行得慢一点(与iOS8相比 – 记得我正在用XCode 6.2和iOS8.2 SDK进行开发)。 与iOS8相同的硬件运行相同的代码就好了。

为了得出这个结论,我在两个iPod Touch 5中运行我的应用程序,一个用iOS6,另一个用iOS8。 performance的差异非常明显。 在iOS6中加载或取消简单视图(11个子视图)可能需要5秒钟以上(在iOS 8上,从未超过1次)。 在使用iOS7的iPhone 4上,相同的代码performance比iOS6好得多,但比iOS8慢。

我确定这是一个自动布局相关的问题,因为使用相同的代码,我禁用了一些特定的XIB的自动布局(和大小类),他们在iOS6上运行得非常快,而其他视图保持缓慢(如果你打算试试这个,记得删除旧的应用程序,清理项目并重新构build它,或者它仍然会使用自动布局)

2)closures视图控制器或从其超级视图中删除视图时,使用iOS6或7在特定设备上随机崩溃

这里清楚地说明了这个问题。 似乎我遇到了浮动错误问题,因为我可以在崩溃日志中看到一些e-08号码。

这是自动布局采用的严重问题。 这是一个随机的,不可预测的,但可重复的崩溃。 相同的布局约束可以在不同的iOS版本的各种设备中工作。 但是其中一些也会崩溃。 例如:我有一个在iPhone 4(iOS7)上运行良好的视图,在iPad Air(相同的iOS)上解散时视图崩溃。 解决scheme? 从中更改约束的项目关系

x.width = y.widht * 0.8 + 0

y.width = x.widht * 1.25 + 0

这是相当的matematically,但避免了崩溃。

我search了很多,如果有人有办法知道什么时候会发生这个崩溃或者如何解决这个崩溃,所以我可以做出我的观点,而不必担心在每个设备上testing它们,每个iOS版本,以确保它不会崩溃。 我无法find一个去解决它。

这个崩溃似乎并没有发生在iOS8。

PS:我试图删除所有我的子视图中的约束之前从超级视图中删除视图,但是当删除一个约束时发生崩溃。 我找不到任何理由,为什么它被删除时崩溃。

3)我在这个问题的第一部分描述的问题

这是第三个重要的问题,因为我可以解决这个devise的单元格没有自动布局。 这将是一个小问题,如果应用程序的其余部分不使用单元格,情况就是如此。

但这仍然是一个我无法理解,也无法用自动布局解决的问题。 当我删除自动布局时,单元格显示得很好。 而且他们在iOS8上的工作正常,我再次检查,如果我使用一些特定的iOS8function,我不是。

底线

我放弃了自动布局,而我必须同时支持iOS6和7,或者直到find解决上面列出的前两个问题的方法。

我已经尝到了Autolayout的力量,我真的很喜欢它,但我不能担心在特定的iOS版本的特定硬件中隐藏的一些神秘的closures隐藏的不可预知的崩溃。 我也不能接受iOS6的糟糕performance(不久之后,我们应该放弃对iOS6的支持,所以这将是一个失败的问题)。