在 iOS 7 中,layoutSubviews 方法在 UIButton 子类上不断调用

dkm*_*kmp 3 iphone objective-c uibutton ipad ios7

我在视图上有一个 UIButton 的子类。在 iOS 6、5 等中效果很好。但在 iOS 7 中,当我尝试更改标题(使用 setTitle:forState:)时,我注意到延迟。我已经将问题追溯到这样一个事实,即基金会不断在我的控件上调用 layoutSubviews,这导致 CPU 使用率在应用程序的整个生命周期内徘徊在 100% 左右。

在我的子类中,我覆盖了 layoutSubviews 并添加了一个断点来诊断问题。回溯只显示了从基础中的 [UIView layoutSublayersOfLayer] 方法调用的方法。

请注意,如果我注释掉这一行:

[super layoutSubviews];

CPU 问题消失了,但当然还有其他问题出现。

有没有人看到这个?为什么 iOS 7 不断调用 layoutSubviews?

dkm*_*kmp 5

发现问题了。在我的 setEnabled: 方法(首先是子类的部分原因)中,我有以下几行:

self.titleLabel.alpha = enabled ? 1.0 : 0.8;
Run Code Online (Sandbox Code Playgroud)

显然在 iOS 7 中,这会导致 UIButton 开始一个它永远不会完成的标题更改动画。结果是一个无限循环,其中 layoutSubviews 被重复调用。

修复是在更改 titleColor 时包含此行:

[self setTitleColor:[[self titleColorForState:UIControlStateNormal] colorWithAlphaComponent:0.8] forState:UIControlStateDisabled];
Run Code Online (Sandbox Code Playgroud)

并且避免了无限循环!