使用情节提要逆转自定义 Segue
Posted
技术标签:
【中文标题】使用情节提要逆转自定义 Segue【英文标题】:Reversal of Custom Segue with Storyboarding 【发布时间】:2012-03-08 03:26:36 【问题描述】:我有一个自定义 segue 动画,当将新视图控制器推入堆栈时会发生这种动画。然而,当弹出带有所述自定义 segue 的视图控制器时,会发生默认导航控制器动画(即,当前视图控制器动画向右,而父视图控制器从左边缘在屏幕上平移)。
所以我的问题是:有没有办法编写一个自定义的弹出 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];
];
【问题讨论】:
所以要明确一点,您实际上是在反转自定义转场,而是使用单独的自定义转场返回? 通过使用 segue 循环回自身,您是否还在不必要地创建原始视图控制器的另一个实例?我想除了内存配置文件中的一个短暂的亮点外,没有人会注意到。 :) 【参考方案1】:是的。这是我弹出到顶层的示例。当您在 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];
@结束
【讨论】:
PopSegue 应该是 UIKit 的一部分。好一个! 这会不必要地创建/取消分配新的目标视图控制器。最好不要使用 Segue,而只是弹出视图控制器。是的,我同意 - Apple 应该包括对 pop segue 的支持。 我喜欢 PopToRoot 的解决方案,但 pop 的解决方案只有一个视图……不多。我添加了一些东西,所以当你只需要返回一个动画时,动画仍然存在: - (void) perform UIViewController *src = (UIViewController *) self.sourceViewController; [UIView transitionWithView:src.navigationController.view 持续时间:0.5 选项:UIViewAnimationOptionTransitionCrossDissolve 动画:^ [src.navigationController popViewControllerAnimated:NO]; 完成:NULL]; 【参考方案2】:对于现在关注这一点的任何人,ios 7 都允许您以两种方式制作动画:
将 segue 设置为 Push,然后查看下面的代码以了解推送实现。
https://github.com/Dzamir/OldStyleNavigationControllerAnimatedTransition
【讨论】:
【参考方案3】:正如评论者 Linus 所指出的,所提出的其他解决方案将创建 UIViewController 的另一个实例。我认为此处的此链接描述了启用反向转场动画的其他替代方法。
http://robsprogramknowledge.blogspot.com/2012/05/back-segues.html
【讨论】:
这篇文章讨论了将信息从视图控制器传递到其父视图控制器,根本不涉及动画或过渡。以上是关于使用情节提要逆转自定义 Segue的主要内容,如果未能解决你的问题,请参考以下文章
使用自定义 Segue 快速切换到和 FromTable ViewController 问题
自定义 UITableViewController 单元格 segue 不推送
在执行自定义 segue 之前禁用工具栏 UIBarButtonItem