什么导致我的segues延迟?

时间:2013-01-29 05:31:41

标签: ios performance instruments autolayout uistoryboardsegue

当我点按后退按钮时,我的一个视图冻结了几秒钟。

此外,当我点按此视图中的某个项目时,它会显示一个弹出窗口(自定义,而不是UIPopoverController)。这个弹出窗口看起来非常快,但是当我“翻转”弹出窗口以查看它的背面时,会发生同样的长时间延迟。

我怀疑原因与视图的复杂性有关。正如您在下面的屏幕截图中看到的那样,它是一个集合视图,它有一个背景,一些子视图被轮换(UIViewEdgeAntialiasing打开)。

The white bars that hide the text are not part of the app

我使用了仪器中的Time Profiler来弄清楚发生了什么,但我被卡住了。

The selected time period is when I press the back button and the freeze occurs

除非我取消选择“隐藏系统库”,否则我看不到任何有用的东西:

Include system libraries

如果我查看方法名称,我认为它们与自动布局有关。这表明它正试图在segue期间渲染一些东西。但是不会调用诸如cellForItemAtIndexPath之类的方法。

还有这个应用程序的iPhone版本,我根本没有遇到这个问题。它使用tableview而不是collectionview。它还有背景和旋转图片。

我使用模拟器进行了这些测量;在我的iPad Mini上情况更糟;动画开始前最多可能需要20秒。

更新 - 感谢您的回答我尝试过的事情:

  • 关闭UIViewEdgeAntialiasing:对效果没有影响

2 个答案:

答案 0 :(得分:0)

我认为这可能是由于UIViewEdgeAntialiasing标志造成的。看起来您的主视图(具有大量轻微旋转图片的视图)具有大量抗锯齿边缘,因此在iPad的GPU上非常沉重。当您的弹出窗口旋转时(即当背景再次显示时)绘图性能变慢的事实给出了一些信任。

尝试将其关闭,看看性能是否有所改善。它看起来怎么样?

答案 1 :(得分:0)

旋转是这里的坏人。每个UICollectionViewCell都有一个UIView作为容器视图,其中包含UIImageView。我像这样旋转它:

container.transform = CGAffineTransformMakeRotation(M_PI * someRandomFloat);

删除该行,一切都很顺利。

我在iPhone上使用相同的技术,但显然这种轮换对UITableViewCell的影响小于UICollectionViewCell

我尝试将UICollectionViewFlowLayout子类化为旋转单元格而不是一个子视图。不幸的是,这会导致类似的性能问题。