1

Я работал над реализацией специального модального перехода, который использует подкласс UIPresentationController для создания и управления дополнительным представлением во время презентации и увольнения. Apple помогает пример того, как это сделать в the documentation, но я попал в ловушку.Custom Modal Transition Dismiss Animation Runs Desynchronized

При представлении модальности мои пользовательские анимации представлений работают отлично, но когда я отклоняю модальный, анимации, применяемые к пользовательским представлениям в dismissalTransitionWillBegin, воспроизводят синхронизацию с анимациями, указанными объектом анимации перехода. Я возвращаюсь из animationControllerForDismissedController:. В частности, анимация пользовательского вида игнорирует продолжительность анимации перехода и всегда играет очень быстро (продолжительность составляет около 0,2 секунды).

Что может вызвать animateAlongsideTransition:completion:, чтобы игнорировать продолжительность базовой анимации?

ответ

2

Источником проблемы является ошибка в iOS.

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

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

  1. Контроллер вид Предъявление находится в пределах элементов панели кнопок View Controller это UINavigationController
  2. Представляющий включают изображения на основе UIBarButtonItem
  3. окно имеет цвет оттенка набор

Когда эти три условия выполнены, то анимация блок animateAlongsideTransition: вызова в dismissalTransitionWillBegin будет выполняться до анимации блока animateWithDuration: позвонить по телефону animateTransition. Это, по-видимому, мешает анимации пользовательского вида получать продолжительность анимации перехода. В моем тестировании анимация animateAlongsideTransition: длилась 0.215 секунд, что, по-моему, является длительностью по умолчанию.

Я не смог найти способ предотвратить возникновение проблемы, кроме устранения одного из трех факторов, запускающих его. Обходной путь, который я в конечном итоге остановил, заключался в удалении цвета оттенка окна и вместо этого установлении глобального цвета оттенков с использованием внешнего вида UIView. Есть некоторые побочные эффекты - например, UIAlertView s 'кнопки становятся тонированными, но для моих целей это было приемлемым компромиссом.