我将一个新的视图控制器推入堆栈时会出现自定义的segue动画。然而,当弹出与所述自定义segue一起呈现的视图控制器时,默认导航控制器动画发生(即,当父视图控制器从左边缘在屏幕上翻译时,当前视图控制器向右动画)。
所以我的问题是:有没有办法编写一个自定义的pop segue动画,当从视图控制器弹出堆栈时会发生这种动画?
编辑(解决方案):
我最终定义了一个类似于所选答案的自定义segue。在Storyboard中,我将一个自定义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];
}];
}
答案 0 :(得分:19)
是。这是一个我弹出顶级的例子。在Storyboard中创建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
如果您只想弹出一个级别更改,请使用此自定义segue:
// 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
答案 1 :(得分:1)
对于现在关注此项目的任何人,iOS 7都可以让您以两种方式进行动画处理:
将segue设置为Push,然后查看下面的代码以进行推送实现。
https://github.com/Dzamir/OldStyleNavigationControllerAnimatedTransition
答案 2 :(得分:-1)
正如Linus指出的那样,提出的其他解决方案将创建另一个UIViewController实例。我认为这里的链接描述了启用反向segue动画的其他替代方法。
http://robsprogramknowledge.blogspot.com/2012/05/back-segues.html