Пользовательские переходы Push/Popping UIViewControllers
-
14-11-2019 - |
Вопрос
Я пытаюсь реализовать флип-переход в стиле iBooks в качестве раскадровки.Переход должен подтолкнуть соотв.лопни destinationViewController
в/из стека UINavigationControllers.
Я могу использовать контроллеры просмотра в своих переходах. perform
метод, но я не могу поп.Когда я вставляю контроллер сразу после создания анимации переворота, анимация не запускается, и ее обратный вызов - это должно сработать. [[UIApplication sharedApplication] endIgnoringInteractionEvents]
мне никогда не звонят, и мое приложение не работает.
Поэтому я попытался нажать/вставить animationDidStop:anim:flag
делегата, но он никогда не вызывается с флагом, установленным в true.
Я предполагаю, что переход освобождается до вызова метода делегата.Что еще я мог сделать?
Решение
Простите меня, если я совершенно неправильно понимаю этот вопрос, но похоже, что вы просто хотите выполнить базовое горизонтальное переворот вперед и назад между двумя контроллерами представления.И даже если вы уже это поняли, возможно, это поможет всем, у кого возник тот же вопрос.
(1) В вашей раскадровке (которая имеет ViewController A и B) создайте модальный переход от A к B.Дайте ему идентификатор (showViewControllerB) и выберите «Переход: Отразить по горизонтали».
Настраиваем протокол и делегатов:
(2a) В ViewControllerB.h добавьте выше @interface:
@class ViewControllerB;
@protocol ViewControllerBDelegate
- (void)viewControllerBDidFinish:(ViewControllerB *)controller;
@end
(2b) Добавьте делегата как свойство:
@property (weak, nonatomic) id <ViewControllerBDelegate> delegate;
(3a) В ViewControllerB.m синтезируйте:
@synthesize delegate;
(3b) И делегируем метод обратного переворота:
- (IBAction)flipBack:(id)sender
{
[self.delegate viewControllerBDidFinish:self];
}
(4) В ViewControllerA.h добавьте в самом верху #import "ViewControllerB.h"
и в конце @interface <ViewControllerBDelegate>
(5a) В ViewControllerA.m добавьте метод, соответствующий протоколу:
- (void)viewControllerBDidFinish:(ViewControllerB *)controller
{
[self dismissModalViewControllerAnimated:YES];
}
(5b) Затем установите его в качестве делегата в prepreForSegue:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showViewControllerB"]) {
[[segue destinationViewController] setDelegate:self];
}
}
Надеюсь, это ответит на ваш вопрос.Если я неправильно понял, просто дайте мне знать.
Другие советы
Ваш вопрос немного сбивает с толку, поскольку вы смешиваете толчок, толчок, переворот и сальто назад.Я не уверен, сможет ли ИИ ответить на ваш вопрос, но могу сказать, что я сделал.
Если я вставлю viewController в стек контроллера навигации и установлю для стиля перехода раскадровки значение Push, он будет вставлен в представление справа налево.Появится кнопка «Назад», в которой будет отображаться заголовок представляющего ViewController.
Если я установлю стиль перехода раскадровки на модальный, я могу установить переход на переворот по горизонтали (кажется, это то, что вы хотите).Но тогда кнопка «Назад» не появится.В представленномViewController я закрываю представление с помощью:
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
Он перевернет второй вид назад с помощью поворота вправо.
Но это грязное решение, и Apple не рекомендует его.
Люк Дуберт привел пример реализации делегата.