Сторнирование Custom Segue с помощью раскадровки

У меня есть пользовательская анимация segue, которая возникает при нажатии нового контроллера представления в стек. Однако при появлении контроллера вида, который был представлен указанным пользовательским сегментом, происходит анимация контроллера навигации по умолчанию (т.е. Текущий контроллер просмотра анимируется справа, а родительский контроллер представления переводит экран на левый край).

Итак, мой вопрос заключается в следующем: есть ли способ написать пользовательскую анимацию pop segue, которая возникает при появлении контроллера вида со стека?

Изменить (решение):

В итоге я определил пользовательский сегмент, подобный выбранному ответу. В Storyboard я перетащил пользовательский segue из контроллера дочернего представления обратно в его родительский элемент, дал ему идентификатор и вновь записанный обратный сегмент в качестве своего класса. Да, я понимаю, что он практически идентичен модальному переходу. Требования клиентов требовали этого безумия, поэтому, прежде чем комментировать, поймите, что я знаю, что не нужно делать это при нормальных обстоятельствах.

- (void)perform {
  UIViewController *src = (UIViewController *)self.sourceViewController;
  UIViewController *dest = (UIViewController *)self.destinationViewController;

  [UIView animateWithDuration:0.3 animations:^{
    CGRect f = src.view.frame;
    f.origin.y = f.size.height;
    src.view.frame = f;

  } completion:^(BOOL finished){
    src.view.alpha = 0;
    [src.navigationController popViewControllerAnimated:NO];
  }];
}

Ответы

Ответ 1

Да. Вот пример, когда я выхожу на верхний уровень. Когда вы создадите segue в Раскадке. Используйте select или введите новый новый класс segue в инспекторе атрибутов.

//
//  FlipTopPop.h

#import <UIKit/UIKit.h>


@interface FlipTopPopToRoot : UIStoryboardSegue

@end

и

//  FlipTopPop.m

#import "FlipTopPopToRoot.h"

@implementation FlipTopPopToRoot

- (void) perform {

    UIViewController *src = (UIViewController *) self.sourceViewController;
    [UIView transitionWithView:src.navigationController.view duration:0.5
                   options:UIViewAnimationOptionTransitionFlipFromBottom
                animations:^{
                    [src.navigationController popToViewController:[src.navigationController.viewControllers objectAtIndex:0] animated:NO];;
                }
                    completion:NULL];
}

@end

Если вы хотите всплыть только на один уровень, используйте этот пользовательский сегмент:

//  PopSegue.h

#import <UIKit/UIKit.h>

@interface PopSegue : UIStoryboardSegue

@end

и

//  PopSegue.m

#import "PopSegue.h"

@implementation PopSegue

- (void) perform {

    UIViewController *src = (UIViewController *) self.sourceViewController;
    [src.navigationController popViewControllerAnimated:YES];
}

@end

Ответ 3

Как отметил комментатор Линус, другие представленные решения создадут еще один экземпляр UIViewController. Я думаю, что эта ссылка здесь описывает другие альтернативы, позволяющие анимацию обратного сегмента.

http://robsprogramknowledge.blogspot.com/2012/05/back-segues.html