2013-09-24 3 views
2

У меня есть подкласс UIButton на представлении. Отлично работает в iOS 6, 5 и т. Д. Но в iOS 7 я замечаю задержки при попытке изменить заголовок (используя setTitle: forState :). Я отследил эту проблему до того факта, что фонд постоянно вызывает layoutSubviews на моем элементе управления, и это приводит к тому, что использование ЦП наводится на 100% на всю жизнь приложения.В iOS 7 метод layoutSubviews вызывается постоянно на подклассе UIButton

В моем подклассе я перепробовал layoutSubviews и добавил точку останова для диагностики проблемы. Backtrace показывает только метод, вызванный методом [UIView layoutSublayersOfLayer] в базе.

Обратите внимание, что если я закомментировать эту строку:

[super layoutSubviews];

проблема CPU уходит, но, конечно же, возникают другие проблемы.

Кто-нибудь видел это? Почему iOS 7 постоянно вызывает layoutSubviews?

+0

Можете ли вы предоставить код? Обычно вы вызываете этот метод только потому, что вы подклассифицируете 'layoutSubviews'. Если вам нужно форсировать макет, вы обычно будете использовать 'setNeedsLayout', чтобы избежать множественных вызовов макета, так что в вашем коде может быть что-то подозрительное. –

+0

Спасибо, Брайан. Я только подклассифицировал layoutSubviews, чтобы диагностировать привязку процессора на 100%. Когда я прокомментирую метод, проблема не исчезнет. – dkmp

+0

В том же духе я также попробовал подклассифицировать setNeedsLayout и нашел (с точкой останова), что он вызывается из [UIButton _beginTitleAnimation] (частный метод). Я был бы доволен отключением анимации для кнопки, но я не знаю, как это сделать. – dkmp

ответ

4

Обнаружена проблема. В моем setEnabled: метод (часть причины для подкласса в первой очереди), я имел следующую строку:

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

И, видимо, в прошивке 7, это вызывает UIButton начать титульное изменение анимации, что это никогда не заканчивается. Результатом является бесконечный цикл, в котором многократно вызывается layoutSubviews.

Исправление должно было включать эту строку, когда titleColor изменяется:

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

И бесконечный цикл предотвращена!

Смежные вопросы