#iphone #objective-c #modalviewcontroller #presentmodalviewcontroller
#iPhone #objective-c #modalviewcontroller #presentmodalviewcontroller
Вопрос:
Я пытаюсь переключаться между двумя разными активными контроллерами модального просмотра и пытаюсь добиться плавной анимации. В идеале я хотел бы, чтобы анимация выглядела так же, как новый модальный вид становится модальным видом поверх текущего модального вида.
Для обеспечения согласованности в моем приложении мне нужно ограничить только один уровень контроллеров модального просмотра, отображаемых в любой момент времени.
В настоящее время я просто отключаю существующий модальный вид без анимации, а затем анимирую следующий модальный вид поверх RootController, но это выглядит не очень хорошо.
Спасибо
Ответ №1:
Вы можете просто представить 2-й контроллер представления модели поверх первого, используя переход по умолчанию. Похоже, что ваше второе представление модели выделяется и инициализируется в том же контроллере представления, что и ваше первое представление модели. Если это так, рассмотрите возможность рефакторинга вашего кода, чтобы первый контроллер представления модели представлял второй контроллер модального представления. Выполнение этого будет отображать одно поверх другого, как вы хотите.
Если вам нужно сохранить код для представления обоих контроллеров модального представления в одном корневом контроллере представления, вы можете создать метод делегирования. Это отправило бы сообщение от первого контроллера модального представления обратно к корневому контроллеру представления, который его представил, передавая ссылку на первый контроллер модального представления. Далее, используйте эту ссылку, чтобы указать первому контроллеру модального представления представить 2-й контроллер модального представления поверх него.
Я бы определенно рекомендовал первое решение, хотя оно логически понятнее и с меньшей вероятностью введения цикла сохранения.
В ответ на ваше разъяснение:
Для перехода между двумя, попробуйте:
В вашем ModalViewControllerOne
экземпляре, который уже отображается из предыдущего сеанса:
self.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self dismissModalViewControllerAnimated:YES];
В вашем RootViewController -viewDidAppear:
ModalViewControllerTwo *modalViewControllerTwo = [[ModalViewControllerTwo alloc] init];
modalViewControllerTwo.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[rootViewController presentModalViewController:modalViewControllerTwo animated:YES];
Идея этого заключается в перекрестном растворении первого контроллера модального представления обратно в корневой контроллер представления, а затем немедленном перекрестном растворении нового контроллера модального представления обратно на экран.
Если это просто представление, которое отличается между заставками, вы могли бы вместо двух контроллеров просмотра иметь один контроллер просмотра с логикой, которая просто заменяет одно представление на другое в зависимости от введенного URL и использовать анимацию при переключении между представлениями.
Комментарии:
1. Каждый из этих модальных дисплеев, по сути, представляет собой отдельный экран заставки / входа в систему. В зависимости от URL, используемого для входа в приложение, я показываю другую модальную заставку. Итак, если при предыдущем использовании приложения всплеск 1 запущен, и они входят в приложение с URL-адреса, запрашивающего всплеск 2, я бы хотел плавный переход от всплеска 1 к всплеску 2 без обоих, один поверх другого.
2. Я просто отслеживаю один UINavigationController в качестве моего «modalController» и передаю стек ViewControllers одному методу делегирования, и если window.RootController имеет «presentedController», то он представляет modalController, и я просто заменяю ViewControllers анимацией. В противном случае я все еще устанавливаю контроллеры просмотра modalController и вызываю window.RootController Представляет modalViewController:modalController