2013-09-24 43 views
2

我在視圖上有一個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

回答

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]; 

和無限循環避免!

相關問題