我遇到了一个非常奇怪的问题,我很想知道,如果有人能帮助我,因为我完全迷失了。
上下文:
我正在开发一个具有相对简单的层次结构的app。只是一些视图控制器,但相当多的高分辨率图像。它们以UIScrollView
呈现,带有一些文本等。在纵向模式下测试时,滚动视图根本不能平滑滚动。似乎帧速率下降到大约4-5 fps。首先,我认为这是因为高分辨率图像。
但随后我将iPad转为横向模式,一切顺利。由于我有一个单独的xib文件用于纵向和横向,我认为在portrait-xib中必须存在问题。事实证明,没有。两者都具有相同的VC类,因此使用相同的代码和两个xib几乎相同,除了视图的大小和位置。
为了缩小问题范围,我使用了Instrument的TimeProfiler来查看导致问题的原因。事实证明,TimeProfiler显示了对[NSISEngine optimize]
的一些调用(由NSLayoutConstraint
触发)。
在纵向模式下,更多的呼叫和那些呼叫花了更长的时间。在树的下方,我看到纵向模式[NSISEngine optimize]
称为[NSISEngine fixupIntegralizationViolations]
,而在景观中则没有。{/ p>
我甚至从应用程序中删除了除rootVC之外的所有viewcontroller,以及rootVC提供的另一个。所呈现的vc只包含一些图像,按钮和一些动画。它只有一个xib用于两个方向,并且(正如所有其他方式一样)布局了自动布局。
布局在两个方向都应该有效,并且没有含糊之处(据我所知。至少po [[UIWindow keyWindow] _autolayoutTrace]
没有显示任何含义)。
我附上了vc演示过程的TimeProfile截图。一个用于纵向,一个用于横向。正如您所看到的,在横向上,[NSISEngine optimize]
的调用仅需要一毫秒,而在纵向上则需要超过3000毫秒。
有没有人可以告诉我为什么会这样?或者也许知道我能做些什么来找出问题所在?
非常感谢任何帮助!
THX
链接到较大版本的图片:link
答案 0 :(得分:4)
我遇到了同样的问题,其中有一个中等复杂的视图,它在非Retina iPad或Retina iPad上以纵向模式表现良好。在Retina设备上的横向模式下,显示弹出窗口或在视图堆栈上推送另一个视图需要花费10倍的时间。我最终用视图控制器中的手动编码loadView替换了XIB文件。这似乎消除了这个问题。界面构建器倾向于创建过多的约束,因此控制它是良好的自动布局性能的关键。
我也开了一张关于这个问题的支持票。
更新
我在我的情况下找到了原因。这是一组约束:
NSArray *constraints = [NSLayoutConstraint
constraintsWithVisualFormat : @"|[sunLabel][monLabel(==sunLabel)][tueLabel(==sunLabel)][wedLabel(==sunLabel)][thuLabel(==sunLabel)][friLabel(==sunLabel)][satLabel(==sunLabel)]|"
options : 0
metrics : nil
views : labelViewsDictionary];
它指定父视图中的7个标签都共享相同的大小,并且都扩展了父视图的宽度。我认为布局的过度关系性质使得自动布局适合,特别是因为父视图宽度不能被7整除。
为解决这个问题,我创建了一个约束数组,用于指定每个标签的宽度并应用这些约束。当设备旋转时,父项的宽度发生变化,因此我返回并将约束上的常量调整为父视图宽度的1/7。这现在表现良好,加载弹出窗口的过程现在需要不到300毫秒而不是2000毫秒。
答案 1 :(得分:3)
我就此问题提出了技术支持请求,最后得到了答案,这很可能是一个错误。错误报告已提交。希望他们能尽快解决。如果有任何消息,我会更新这个答案。
答案 2 :(得分:0)
我昨天在Ipad iOS6.1设备上遇到了同样的问题。检测应用程序发现方法fixupIntegralizationViolations每次调用大约300毫秒(大约20次,这是很多)使应用程序绝对无用。
我的问题与杰克考克斯的评论非常相似,但我的解决方法不同。我的约束是:
@" H:| [allButton] [inStoreButton(== allButton)] [onlineButton(== allButton)] [sortButton(50)] |"
问题是这里的parentView是完整的iPad横向宽度,所以这个约束的数学是给每个按钮这个宽度:(1024-50)/ 3 = 324.6666667。
这通常不是autolayout中的一个问题,因为它会处理大的浮点数并正确地舍入它们,但似乎在iPad iOS6 Landscape舍入这个数字会触发阻止UI的错误。要解决这个问题,我所要做的就是将sortButton改为52,所以现在每个按钮的宽度为:(1024-52)/ 3 = 324.这就是全部。现在,方法fixupIntegralizationViolations每次调用大约需要1ms。
有趣的是,使用52在Landscape中给它一个非十进制宽度,但它确实给出了十进制数字的纵向:(768-52)/ 3 = 238.666667。但是,肖像似乎没有任何错误,自动布局正确地对数字进行舍入。