首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >纵向模式下的iOS自动布局性能问题。[NSISEngine优化]

纵向模式下的iOS自动布局性能问题。[NSISEngine优化]
EN

Stack Overflow用户
提问于 2012-10-18 09:16:31
回答 3查看 2.9K关注 0票数 20

我遇到了一个非常奇怪的问题,我想知道,既然我完全迷路了,是否有人能在这里帮助我。

上下文:我正在开发一个层次结构相对简单的应用程序。只有几个视图控制器,但有相当多的高分辨率图像。当在纵向模式下测试时,滚动视图根本不能平滑地滚动。它似乎帧速率下降到大约4-5帧/秒。首先,我认为这是因为高分辨率的图像。

但后来我把iPad调到了横屏模式,一切都运行得很顺利。由于我有一个单独的xib文件用于肖像和风景,我认为在肖像-xib中一定有问题。两者都有相同的VC类,因此使用相同的代码,两个xibs几乎相同,只是视图的大小和位置不同。

为了缩小问题的范围,我使用了Instrument的TimeProfiler来查看导致问题的原因。结果,TimeProfiler显示了一些对[NSISEngine optimize]的调用(由NSLayoutConstraint触发)。在纵向模式下,会有更多的呼叫,而且这些呼叫花费的时间更长。沿着这棵树再往下走,我看到在纵向模式下,[NSISEngine optimize]称为[NSISEngine fixupIntegralizationViolations],而在横向模式下没有。

我甚至从应用程序中删除了所有的视图控制器,除了rootVC和另一个由rootVC呈现的视图控制器。呈现的vc只包含一些图像、按钮和一些动画。它只有一个用于两个方向的xib,并且(和所有其他的一样)是自动布局的。

布局在两个方向上都能正常工作,并且没有歧义(据我所知。至少po [[UIWindow keyWindow] _autolayoutTrace]没有显示任何内容)。

我附上了一张风投演示流程的TimeProfile截图。一个用于肖像,另一个用于风景。正如你所看到的,在风景中,对[NSISEngine optimize]的调用只需要一毫秒,而在肖像中,它们需要超过3000ms。

有谁能告诉我为什么会这样吗?或者是否知道我可以做些什么来找出问题所在?

任何帮助都将不胜感激!

Thx

链接到更大版本的图像:link

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-27 06:04:00

我提交了关于这个问题的技术支持请求,最终得到了答案,这很可能是一个bug。错误报告已归档。希望他们能尽快解决这个问题。如果有任何新闻,我会更新这个答案。

票数 3
EN

Stack Overflow用户

发布于 2013-03-29 21:30:04

我遇到了同样的问题,在一个中等复杂的视图中,它在非视网膜iPads或纵向模式下的视网膜iPad上表现良好。在Retina设备上的横向模式下,显示弹出窗口或将另一个视图推送到视图堆栈上所需的时间增加了10倍。最后,我在视图控制器中用手工编码的loadView替换了XIB文件。这似乎已经消除了这个问题。界面构建器倾向于创建过多的约束,因此得到控制是良好的自动布局性能的关键。

我还开了一个关于这个问题的支持票据。

更新:

我在我的情况下找到了原因。它是以下一组约束:

代码语言:javascript
复制
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。这现在执行得很好,加载弹出窗口的过程现在只需要不到300ms而不是2000ms。

票数 4
EN

Stack Overflow用户

发布于 2014-05-15 23:02:21

昨天我在iPadiOS6.1设备上也遇到了同样的问题。检测应用程序发现,每次调用(大约20次,这是很多)时,fixupIntegralizationViolations花费了大约300ms的方法,使得应用程序完全无用。

我的问题与Jack Cox评论的问题非常相似,但我以不同的方式解决了它。我的约束是:

@"H:|allButtononlineButton(==allButton)|“

问题是这里的parentView是整个iPad的横向宽度,所以这个约束的数学计算是给每个按钮这个宽度:(1024-50)/3 = 324.6666667。

这在自动布局中通常不是问题,因为它负责处理大的浮点数并正确地对它们进行舍入,但在iPad iOS6横向舍入该数字似乎会触发一个bug,从而阻塞UI。为了绕过它,我所要做的就是将sortButton改为52,所以现在每个按钮的宽度是:(1024-52)/3 = 324。就这样。现在,fixupIntegralizationViolations方法每次被调用都需要大约1ms。

有趣的是,使用52在Landscape中给出的不是十进制宽度,但在肖像中却给出了一个十进制数:(768-52)/3 = 238.666667。然而,肖像似乎没有任何错误,自动布局正确地对数字进行了舍入。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12945746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档