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

问题描述:

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

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

需要注意的是,如果我注释掉这一行:

[super layoutSubviews];

CPU的问题消失了,但是,当然,出现的其他问题。

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

+0

你能提供一些代码吗?通常你只会调用该方法,因为你是'layoutSubviews'的子类。如果你需要强制布局,你通常会使用'setNeedsLayout'来避免多次布局调用,所以在你的代码中可能会有其他地方出现。 –

+0

谢谢,Brian。我只用subclassed layoutSubviews来诊断100%的CPU挂钩。当我评论这种方法时,问题不会消失。 – dkmp

+0

以同样的方式,我也尝试了setNeedsLayout的子类化,并发现(有断点)它是从[UIButton _beginTitleAnimation](一个私有方法)调用的。我会满足于禁用按钮的动画,但我不知道有办法做到这一点。 – dkmp

发现问题。在我的setEnabled:方法(对于摆在首位的子类的部分原因),我有以下行:

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

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

此修复程序是包括这条线时,titleColor改变:

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

和无限循环避免!