【发布时间】:2013-09-24 20:02:50
【问题描述】:
我在视图上有一个 UIButton 的子类。在 iOS 6、5 等中运行良好。但在 iOS 7 中,当我尝试更改标题(使用 setTitle:forState:) 时,我注意到延迟。我发现这个问题是由于基金会不断在我的控件上调用 layoutSubviews,这导致 CPU 使用率在应用程序的生命周期内徘徊在 100% 左右。
在我的子类中,我覆盖了 layoutSubviews 并添加了一个断点来诊断问题。回溯只显示从基础中的 [UIView layoutSublayersOfLayer] 方法调用的方法。
请注意,如果我注释掉这一行:
[super layoutSubviews];
CPU 问题消失了,但当然会出现其他问题。
有人看过吗?为什么 iOS 7 不断调用 layoutSubviews?
【问题讨论】:
-
你能提供一些代码吗?通常,您只会调用该方法,因为您正在继承
layoutSubviews。如果您需要强制布局,您通常会使用setNeedsLayout来避免多次布局调用,因此您的代码中的其他地方可能会有问题。 -
谢谢,布赖恩。我只对 layoutSubviews 进行子类化以诊断 CPU 挂在 100%。当我注释掉该方法时,问题并没有消失。
-
同样,我也尝试继承 setNeedsLayout,并发现(带有断点)它是从 [UIButton _beginTitleAnimation](私有方法)调用的。我会满足于禁用按钮的动画,但我不知道如何做到这一点。
-
这并不能解释为什么你会经常看到
layoutSubviews。动画只会调用一次。当您查看 Instruments 时,您是否看到layoutSubviews经常递归的任何地方(可能在您的类中触发一个方法然后返回)?没有代码就无法回答这个问题。 -
对于在 layoutsubviews 内无限循环中具有 100% cpu 的其他任何人,空的 layoutSubviews 覆盖也会出现同样的问题。
标签: iphone objective-c ipad uibutton ios7