我使用autolayout在UICollectionViewCell中正确布局一些视图。它适用于iOS 8,但是当我尝试在iOS 7或iOS 6上运行时,每次布局时细胞外观都会有很大差异(有时候我看到尺寸和位置发生微小变化 - 一两个像素 - 有时候很大变化,导致一些相当混乱的细胞)。
我发誓我努力找到有同样问题的人,但我无法做到。我没有找到任何可以帮助我解决甚至接近理解问题的答案。
我很感激有关如何更好地解决甚至调试此问题的任何意见。
更多信息
我使用Interface Builder创建视图并设置约束。单元格视图共有17个子视图,包括UIViews及其子视图,它们确实有很多约束。
每次按下按钮,我都会更新一个UIColletionView(包括我自定义单元格的表格)。
我在这里发现令人愤慨的是,当我运行应用程序时,每次按下按钮,细胞都会被按下。子视图会更改其位置和大小。我从不以编程方式更改任何约束或框架。
此外,iOS6上的行为最差。框架变得更多,自动布局运行速度非常慢(即使只有一个单元,也需要3-10秒来更新iPod Touch第五代的集合视图)。
最糟糕的是,如果我不断更新UICollectionView,有时XCode会抱怨不能同时满足约束。但大部分时间它运作得很好。
在从superview中删除一些启用了autolayout的视图时,我也遇到了某些设备崩溃的问题。我发现这是Autolayout引擎的一种奇怪行为,由于浮动错误,它可能会导致一些糟糕的计算。我想知道这两个问题可能是相关的。
由于在搜索了将近一整天之后我无法在整个网络中找到任何帮助,我开始认为这一定是一个愚蠢的错误与愚蠢的解决方案。我希望如此。
提前致谢!
截图
我添加了一些屏幕截图来帮助您查看问题。为了获得这些截图,我使用iOS 6在iPod Touch第5代上运行该应用程序。在iPhone 4上使用iOS 7的行为有所不同(它表现得更好,但我仍然可以使元素在某些像素周围移动)。
每次我按下"更新"按钮,我从其超级视图(整个屏幕)中删除包含UICollectionView的视图,然后重新添加。我不破坏这个视图,它只创建一次。我认为这可能是问题的根源(一些自动布局计算缓冲区保持先前布局的值),但是破坏它并没有解决问题(尽管它确实使得位移不那么频繁和令人不安,但是代价是性能)。
这是预期的行为。这是应用程序打开时的视图:
错误的观点。这是按下"更新"按钮第一次:
第二次按下按钮后的结果:
第三次按下按钮后的结果:
如果我一直按下按钮,我会在屏幕截图3和4之间交替布局(或者至少它们看起来非常相似)。
我放弃自动退出,这就是为什么
好吧,我真的放弃了使用自动布局。我花了差不多一个星期的时间学习用它做很多事情(特别是布置和制作动画视图)。我认为这是一个美妙而强大的功能,我学会了喜欢它。但后来我需要支持iOS6和iOS7。
我发现它只适用于iOS8(任何设备,无论是否旧)。我不知道自己是不是做了一件非常愚蠢的事情,因为我无法在互联网上找到任何关于我所面临的三个杀人问题的线索。
我会在这里列出它们,以防万一有人在未来的某个时间遇到同样的问题或解决方案。按照我给他们的优先顺序排列它们,以便我放弃自动布局。
1)表现
Autolayout在iOS6上运行速度非常慢,在iOS7上运行速度有点慢(与iOS8相比 - 请记住我用XCode 6.2和iOS8.2 SDK进行开发)。与iOS8相同的硬件运行相同的代码就好了。
为了得出这个结论,我用两个iPod Touch 5运行我的应用程序,一个用iOS6,另一个用iOS8。性能上的差异非常明显。在iOS6中加载或关闭简单视图(11个子视图)可能需要5秒以上(在iOS 8上,从不超过1秒)。在带有iOS7的iPhone 4上,相同的代码表现得比iOS6好得多,但比iOS8慢。
我确定这是一个与autolayout相关的问题,因为使用相同的代码,我为某些特定的XIB禁用了自动布局(和大小类),并且它们在iOS6上快速运行,而其他视图保持缓慢< em>(如果你要尝试这个,记得删除旧的应用程序,清理项目并再次构建它,否则它仍将使用自动布局)。
2)在解除视图控制器或从其超级视图中删除视图时,使用iOS6或7的特定设备发生随机崩溃
问题清楚地说明here。我似乎碰到了浮动错误问题,因为我可以在崩溃日志中看到一些e-08号码。
这是自动布局采用的一个严重问题。这是一个随机的,不可预测的 - 但可重现的 - 崩溃。相同的布局约束可以在具有不同iOS版本的各种设备中工作。但它也可能会崩溃。示例:我有一个在iPhone 4(iOS7)上工作正常的视图,并且在iPad Air(同一个iOS)上被解雇时崩溃了。解决方案?从
更改约束的项目关系x.width = y.widht * 0.8 + 0
到
y.width = x.widht * 1.25 + 0
这是等效的,但避免了崩溃。
我搜索了很多,如果有人知道什么时候可能发生这种崩溃或者如何永远解决它,那么我可以在不必担心每个设备上测试它们的情况下制作我的观点,每个iOS版本,确保它不会崩溃。我无法找到解决方法。
这种崩溃似乎不会发生在iOS8中。
PS:在从superview中删除视图之前,我尝试从所有子视图中删除约束,但是在删除一个约束时发生了崩溃。我找不到任何有理由解释为什么它在被移除时会崩溃。
3)我在本期第一部分中描述的问题
这是第三个优先考虑的问题,因为我可以在没有自动布局的情况下解决这个问题。如果应用程序的其余部分不使用单元格,这将是一个小问题,就是这种情况。
但它仍然是一个我无法理解的问题,也无法用autolayout解决。当我删除autolayout时,单元格显示得很好。而且它们在iOS8上运行良好,我仔细检查了我是否使用了某些特定的iOS8功能而且我没有。
BOTTOM LINE
我放弃自动布局,而我必须同时支持iOS6和7,或者直到找到解决上面列出的前两个问题的方法。
我已经尝到了Autolayout的强大功能,我非常喜欢它,但我不能担心在具有特定iOS版本的特定硬件中隐藏在某些神秘异议中的不可预测的崩溃。我也不能接受iOS6的糟糕表现(不过很快我们应该放弃对iOS6的支持,所以这将是一个丢失的问题)。