UIViewControllerAnimatedTransitioning vs自定义UIStoryboardSegue

时间:2014-10-01 21:54:58

标签: ios objective-c

自定义转换对我来说相当新鲜。我必须将它们合并到我工作的最后一个项目中,最后使用UIViewControllerAnimatedTransitioning协议和自定义segues。

自定义segues似乎更清洁/友好,因为您可以在故事板中选择它们并完成它。然而,似乎没有像设置后退/弹出segue那样友好的方式。我已经阅读了关于展开segues但我似乎无法找到任何东西围绕导航控制器的后退按钮。

UIViewControllerAnimatedTransitioning协议方法有一些设置,但允许您指定视图的进入和退出。

如果我的应用程序无法弹回我的自定义segues不是问题,因为应用程序的流程不允许您返回到先前的视图。大多数应用程序虽然需要这样,但是自定义segue似乎毫无价值,除非您继承UINavigationController并允许自定义弹出segue。

我错过了什么,因为看起来UIViewControllerAnimatedTransitioning是视图控制器之间动画的最佳方法。为什么我想要继承UIStoryboardSegue

1 个答案:

答案 0 :(得分:4)

我同意与其他类型的segue相比缺少关于展开segue的文档,但是在你了解它们之后,它们非常简单。我的理解是segues(包括展开segues)是Apple打算在视图控制器之间转换的方式。即使您创建自定义segue,常规展开segue仍应起作用。

在我自己的工作中,我已经将UIStoryboardSegue子类化为在segue之间转换时执行自定义动画。使用广为人知的应用程序作为示例,当您点击Uber应用程序中的菜单按钮时,地图视图控制器向下移动,并出现表格视图控制器。当您在表格中点击一行时,新视图控制器将从右侧滑入,但地图视图控制器仍在屏幕上可见。当您点击地图视图控制器时,它将返回其原始位置。出于某种原因,我认为Uber实际上根本没有实现segues,而只是将视图控制器放在视图控制器之上,但我在自己的应用程序中使用自定义segue实现了类似的东西。这些segue很难用Apple的默认segue复制,所以我使用了自定义的。

如果您将展开的segue绑定到后退按钮,则您需要覆盖uinavigationcontroller中默认后退按钮附带的正常展开。我发现定制segue非常困难。我建议隐藏uinavigationcontroller附带的默认后退按钮,添加自己的栏按钮,并将此新按钮绑定到展开segue。我知道这很烦人,考虑到默认后退按钮有一些附加功能,例如当标题足够短时使用前一个视图控制器的标题作为其文本。不幸的是,我认为Apple真的想阻止你自定义默认按钮并且很难改变。我遗漏了如何用自定义后退按钮替换默认后退按钮,如果您遇到问题,请告诉我。

无论如何,要创建展开segue,您必须首先在uiviewcontroller的类(或父类)中创建一个方法,该方法是(而非来自)。

- (IBAction) methodName:(UIStoryboardSegue *)segueName

您可以将methodNamesegueName更改为您喜欢的任何内容。现在转到您的故事板,然后转到包含您正在从解除uiviewcontroller的场景。如果你现在从这个uiviewcontroller(控制器顶部栏的左侧的黄色按钮)拖动到退出按钮(同一个栏右侧的橙色按钮),你现在会看到一个菜单弹出上面包含methodName。单击该方法,现在将创建展开segue。

创建展开segue后,您现在可以在故事板左侧的轮廓中看到它。如果单击segue,则可以检查它并为其指定标识符。

现在处理将它绑在后面的按钮......

再次,如果您控制从故事板中的自定义后退按钮(不是默认后退按钮)拖动到此{{}的类,则从中展开<{>} uiviewcontroller 1}},将为您绑定按钮创建一个IBAction。在此方法中,添加:

uiviewcontroller

其中[self performSegueWithIdentifier: segueIdentifier sender:nil]; 是您在上面提供展开segue的标识符。现在,当您点击后退按钮时,将执行展开segue。你也可以在执行unwind segue之前做一些动画或不做什么。

我实际上做了一些复杂的自定义展开segues,处理动画源和目标视图控制器的动画。如果你可以更具体地了解你想要放松的样子,我可以试着帮助你。