【问题标题】:UIViewControllerAnimatedTransitioning vs custom UIStoryboardSegueUIViewControllerAnimatedTransitioning 与自定义 UIStoryboardSegue
【发布时间】:2014-11-26 21:09:25
【问题描述】:

自定义转换对我来说相当新。我不得不将它们合并到我从事的最后一个项目中,并最终使用了UIViewControllerAnimatedTransitioning 协议和自定义segues。

自定义转场看起来更干净/友好,因为您可以在故事板中选择它们并完成它。然而,似乎没有一种友好的方式来设置后退/流行segue。我读过关于展开的segues,但我似乎找不到任何关于将一个绑定到导航控制器的后退按钮的东西。

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

如果我的应用程序无法使用我的自定义 segues 弹回,这不是问题,因为应用程序的流程不允许您返回到以前的视图。尽管大多数应用程序都需要这个,因此自定义 segue 似乎毫无价值,除非您将 UINavigationController 子类化并允许自定义弹出 segues。

我是否遗漏了什么,因为 UIViewControllerAnimatedTransitioning 似乎是在视图控制器之间制作动画的最佳方法。为什么我要继承UIStoryboardSegue

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

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

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

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

    无论如何,要创建展开转场,您必须首先在您正在展开(而不是从)的uiviewcontroller 的类(或父类)中创建一个方法。

    - (IBAction) methodName:(UIStoryboardSegue *)segueName
    

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

    创建展开转场后,您现在可以在情节提要左侧的大纲中看到它。如果你点击 segue,你可以检查它并给它一个标识符。

    现在处理将其绑定到后退按钮...

    同样,查看uiviewcontroller 您正在展开 ,如果您控制从情节提要中的自定义后退按钮(不是默认后退按钮)拖动到此uiviewcontroller 的类,将为您创建一个与按钮绑定的 IBAction。在这个方法中,添加:

    [self performSegueWithIdentifier: segueIdentifier sender:nil];
    

    其中segueIdentifer是您在上面提供的展开转场的标识符。现在,当您点击后退按钮时,将执行展开转场。您还可以在执行 unwind segue 之前做一些动画或不做的事情。

    我实际上已经完成了一些复杂的自定义展开segues 来处理源视图控制器和目标视图控制器的动画。如果您可以更具体地说明您希望展开的外观,我可以尝试帮助您。

    【讨论】:

    • 感谢您的详细回复。也许您可以添加有关 UIViewControllerAnimatedTransitioning 以及何时何地适合使用的信息?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2012-07-02
    相关资源
    最近更新 更多