Custom Segue Push / Popping UIViewControllers - PullRequest
6 голосов
/ 26 января 2012

Я пытаюсь реализовать флип-переход, похожий на iBooks, в качестве раскадровки. Segue должен подтолкнуть соотв. вставьте destinationViewController в / из стека UINavigationControllers.

Я могу выдвинуть viewcontrollers в моем методе segues perform, но я не могу выскочить. Когда я выскакиваю из контроллера сразу после создания анимации, анимация не запускается и ее обратный вызов - это должно выполнить [[UIApplication sharedApplication] endIgnoringInteractionEvents] никогда не вызывается, и мое приложение перестает работать.

Итак, я попытался вставить / вытолкнуть метод делегата animationDidStop:anim:flag, но он никогда не вызывался с установленным значением true.

Я предполагаю, что последовательность освобождается до вызова метода делегата. Что еще я мог сделать?

Ответы [ 2 ]

5 голосов
/ 23 июня 2012

Простите, если я полностью неправильно понял этот вопрос, но кажется, что вы просто хотите сделать простое горизонтальное переключение между двумя контроллерами представления. И даже если вы уже поняли это, возможно, это поможет кому-то еще, у кого такой же вопрос.

(1) В вашей раскадровке (в которой есть ViewController A & B) создайте модальный переход от A до B. Дайте ему идентификатор (showViewControllerB) и выберите Transition: Flip Horizontal.

Настраиваем протокол и делегатов:

(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) Затем установите его в качестве делегата в prepareForSegue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showViewControllerB"]) {
        [[segue destinationViewController] setDelegate:self];
    }
}

Надеюсь, это ответит на ваш вопрос. Если я неправильно понял, просто дайте мне знать.

0 голосов
/ 18 октября 2012

Ваш вопрос немного сбивает с толку, так как смешивать поп, пуш, флип и бэкфлип.Я не уверен, что ai сможет ответить на ваш вопрос, но я могу сказать, что я сделал.

Если я помещаю viewController в стек контроллера навигации и устанавливаю Storyboard Segue Style на Push, он будет помещен ввид справа налево.Появится кнопка «Назад», в которой будет отображен заголовок presentingViewController.

Если я установил для стиля Storyboard Segue значение Modal, я могу установить для параметра Transition значение Flip Horizontal (что, по-видимому, является тем, что вам нужно).Но тогда кнопка «Назад» не появится.В представленном ViewController я отклоняю вид с помощью:

[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];

Он перевернет второй вид назад с переворотом вправо.

Но это грязное решение, и оно не рекомендуется Apple.

http://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ManagingDataFlowBetweenViewControllers/ManagingDataFlowBetweenViewControllers.html#//apple_ref/doc/uid/TP40007457-CH8-SW9

Люк Дюбер привел вам пример реализации делегата.

...