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

时间:2013-09-24 20:02:51

标签: iphone objective-c ipad uibutton ios7

我在视图上有一个UIButton的子类。适用于iOS 6,5等。但在iOS 7中,当我尝试更改标题时,我注意到延迟(使用setTitle:forState :)。我已经跟踪了这个问题,因为该基金会不断在我的控件上调用layoutSubviews,这导致CPU使用率在应用程序的生命周期内徘徊在100%左右。

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

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

[super layoutSubviews];

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

有没有人见过这个?为什么iOS 7会不断调用layoutSubviews?

1 个答案:

答案 0 :(得分:4)

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

self.titleLabel.alpha = enabled ? 1.0 : 0.8;

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

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

[self setTitleColor:[[self titleColorForState:UIControlStateNormal] colorWithAlphaComponent:0.8] forState:UIControlStateDisabled];

避免了无限循环!