Анимированное изменение макета ограничения. IfNeeded медленно

Я пытаюсь анимировать мой ADBannerView на экране и за его пределами с помощью автомакета. До автомакета (установка кадра и анимация) все работало нормально. Теперь у меня есть следующий код, и он работает на viewDidLoad, чтобы убедиться, что рекламный баннер не отображается на экране.

[UIView animateWithDuration:kADAnimationDuration
                 animations:^{
                     _addBannerDistanceFromBottomConstraint.constant = 32;
                     [self.view layoutIfNeeded];    
}];

Этот код работает, но он медленный. layoutIfNeeded занимает много времени (относительно) и снижает производительность. Удаление линии делает все красиво и быстро, но анимация не работает.

Вопрос в том... почему это так медленно/как мне ускорить?

Редактировать: Мой пользовательский интерфейс довольно важен, и я подумал, что причиной может быть размещение всего, поэтому я попытался создать простой UIView и поместить туда свой баннер как subview, тогда мне нужно было только вызвать layoutIfNeeded на что subview с 1 элементом в нем. При этом никаких изменений в производительности.


person DBD    schedule 31.12.2012    source источник


Ответы (2)


Я создал приложение с помощью ADBannerView и ничего больше. Такая же проблема существует. Я представил Apple как ошибку и получил «дубликат», так что я думаю, что это известная проблема.

В качестве обходного пути я начинаю с рекламного баннера за пределами экрана и перемещаюсь по экрану только тогда, когда получаю действительное объявление. Хотя работать с раскадровкой немного раздражает, пользователь не заметит разницы, и это предотвратит замедление.

Редактировать: я больше работал с автоматической компоновкой и пришел к неутешительному выводу, которым, кажется, поделился с Мэттом Нойбургом. В бите он написал под названием «медленная автоматическая компоновка на iOS." он сказал:

Жаль, но автоматическая раскладка работает медленно на iOS.

Это в значительной степени подытожило несколько проблем, с которыми я столкнулся при преобразовании одного из моих приложений в автоматический макет. Спектакля просто нет. В примере, который Мэтт приводит в своем посте, автоматическая компоновка занимает в 5 раз больше времени для выполнения той же задачи.

На данный момент, я думаю, я буду избегать автоматической компоновки для чего-то достаточно сложного, чтобы автоматическая компоновка была полезной.

Изменить: iOS 8 находится в стадии бета-тестирования, и ограничения стали значительно быстрее. При большом использовании (50+) все еще есть, особенно на старых устройствах, но при тестировании до сих пор задержка в 2 секунды, которую я получал, была уменьшена примерно до 0,4 секунды. С этим изменением ограничения могли быть достаточно ускорены, чтобы быть жизнеспособными для некоторых тяжелых видов работы с ограничениями.

person DBD    schedule 03.01.2013
comment
Спасибо за ссылку на пост Мэтта. Я тоже отказался от авторазметки по той же причине. Слишком медленно. - person charshep; 12.02.2014

Одной из проблем может быть выполнение этого в viewDidLoad, где параметры представления еще не настроены, хотя я не знаю, почему это замедлит работу. Вместо этого вы можете попробовать это в viewDidAppear. Кроме того, согласно тому, что я видел в сеансах автоматической компоновки WWDC 2012, вы должны добавить ограничение (или изменить константу, как вы это делаете) вне блока анимации, а не внутри. Попробуйте переместить его над блоком анимации.

person rdelmar    schedule 31.12.2012
comment
Ваше право на изменение ограничения в блоке анимации. Я его удалил, но никакого эффекта. Причина, по которой я называю блок анимации viewDidLoad, заключается в том, что это тот же самый метод, который вызывается, когда ADBannerView не загружается. Я попытался переместить его на viewDidAppear, и поведение идентично. - person DBD; 02.01.2013
comment
Если у вас нет опыта работы с ADBannerView, выполняет ли он загрузку с сервера? Я определенно никогда не видел ничего похожего на замедление, которое вы видите при анимации ограничений. - person rdelmar; 02.01.2013
comment
Да, рекламные баннеры загружаются с сервера. У них есть методы делегата, которые в основном являются успешными и неудачными вызовами. Сбой, вы оживляете объявление. Удачи вам в анимации. Я думаю, что мой следующий тест будет пытаться анимировать с помощью простого UIView. Может быть, это сам AdBannerView вызывает замедление анимации ограничения? (ни у одного из моих других ограничений нет проблем с анимацией). - person DBD; 02.01.2013
comment
@DBD, я думаю, что это, вероятно, проблема с AdBannerView - у меня не было проблем ни с другими типами представлений. - person rdelmar; 02.01.2013