В моем приложении я использую drawViewHierarchyInRect:afterScreenUpdates:
, чтобы получить размытое изображение моего представления (используя Apples UIImage
category UIImageEffects).
Мой код выглядит следующим образом:
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
[self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES];
UIImage *im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
/* Use im */
Во время разработки я заметил, что многие мои анимации были задержаны после небольшого использования моего приложения, т.е. мои представления начали анимацию после заметной (но менее секунды) паузы по сравнению с новым запуском приложения.
После некоторой отладки я заметил, что простой акт использования drawViewHierarchyInRect:afterScreenUpdates:
с обновлением экрана, установленным на YES
, вызвал эту задержку. Если это сообщение не было отправлено во время сеанса использования, задержка так и не появилась. Использование параметра NO
для параметра обновления экрана также заставило задержку исчезнуть.
Странно, что этот код размытия совершенно не связан (насколько я могу судить) с задержкой анимации. Анимации, о которых идет речь, не используют drawViewHierarchyInRect:afterScreenUpdates:
, это анимация CAKeyframeAnimation
. Простое действие отправки этого сообщения (с обновлениями экрана, установленным на YES
), похоже, повлияло на анимацию в моем приложении во всем мире.
Что происходит?
(Я создал видео, иллюстрирующие эффект: с и без задержки анимации. Обратите внимание на задержку появления речевого пузыря "Проверка!" в панели навигации.)
UPDATE
Я создал примерный проект, чтобы проиллюстрировать эту потенциальную ошибку. https://github.com/timarnold/AnimationBugExample
ОБНОВЛЕНИЕ № 2
Я получил ответ от Apple, подтверждающий, что это ошибка. См. Ответ ниже.