Обращение на заказ с раскадровкой
-
26-10-2019 - |
Вопрос
У меня есть пользовательская анимация Segue, которая возникает при толчке нового контроллера представления в стек. Однако при вызове контроллера представления, который был представлен указанным пользовательским Segue, происходит анимация контроллера навигации по умолчанию (то есть текущий контроллер представления анимирует справа, в то время как контроллер родительского представления переводится на экране с левого края).
Итак, мой вопрос: есть ли способ написать пользовательскую анимацию Pop Segue 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];
}];
}
Решение
Да. Вот пример, в котором я выхожу на верхний уровень. Когда вы создаете переход в раскадровке. Используйте выберите или введите новый новый класс 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];
}
@конец
Другие советы
Для тех, кто следит за этим сейчас, iOS 7 позволяет оживить вас в обоих направлениях:
Установите Segue, чтобы натолкнуться, затем см. Код ниже для реализации push.
https://github.com/dzamir/oldstylenavigationcontrolleranimatedtransition
Как отметил комментатор Линус, другие представленные решения создадут еще один экземпляр UiviewController. Я думаю, что эта ссылка здесь описывает другие альтернативы, чтобы обеспечить анимацию обратного перехода.
http://robsprogramonkledge.blogspot.com/2012/05/back-segues.html