Сторнирование 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
Ответ 2
Для тех, кто следит за этим сейчас, iOS 7 позволяет вам анимировать оба способа:
Установите segue для Push, затем см. код ниже для реализации push.
https://github.com/Dzamir/OldStyleNavigationControllerAnimatedTransition
Ответ 3
Как отметил комментатор Линус, другие представленные решения создадут еще один экземпляр UIViewController. Я думаю, что эта ссылка здесь описывает другие альтернативы, позволяющие анимацию обратного сегмента.
http://robsprogramknowledge.blogspot.com/2012/05/back-segues.html