Пользовательский модальный переход отклоняет анимацию запускается десинхронизировано

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

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

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


person cszucko    schedule 07.09.2015    source источник


Ответы (1)


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

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

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

  1. Контроллер представления представления находится внутри UINavigationController
  2. Элементы кнопок панели контроллера представления включают в себя основанные на изображениях UIBarButtonItem
  3. Окно имеет набор оттенков

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

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

person cszucko    schedule 07.09.2015