【问题标题】:How to implement interactive transitions in a custom container view controller如何在自定义容器视图控制器中实现交互式转换
【发布时间】:2013-10-23 11:27:28
【问题描述】:

我实现了自己的自定义容器视图控制器,并尝试使其与 iOS 7 视图控制器转换兼容。我使我的自定义容器视图控制器符合UIViewControllerContextTransitioning 并在我调用transitionDuration:animateTransition: 时发送self。只要我只使用动画过渡,一切都可以正常工作。

现在我想让它与交互式过渡一起工作,所以我调用交互控制器的startInteractiveTransition: 而不是动画控制器的animateTransition:,再次使用self 作为参数。但是,如果我使用 UIPercentDrivenInteractiveTransition 作为交互控制器,它会在我的上下文(即容器视图控制器本身)上调用 _animator 方法。当然,我还没有实现这个私有且无证的方法,所以它崩溃了......

我是否在我的实施中遗漏了什么? UIPercentDrivenInteractiveTransition 是否仅与 Apple 类兼容,因为它使用了一些实现魔法(当它要求所有内容都应该在 UIView 动画块中时)?文档和头文件使我们看起来可以实现自己的容器视图控制器并且仍然使用自定义转换,但这是真的还是只是一厢情愿,因为实际上没有人会这样做?

如果我不能使用UIPercentDrivenInteractiveTransition,那么交互/动画逻辑到底应该在哪里?在UIViewControllerTransitionCoordinatorContext 对象中?在UIViewControllerInteractiveTransitioning 对象中(很可能,这个对象是驱动程序...)?或者在UIViewControllerAnimatedTransitioning 对象中(这可能是真正的动画应该发生的地方,但这是否意味着在交互过程中多次调用animateTransition:?或者为交互过渡的每个步骤添加新方法?)

编辑:文档说:

百分比驱动的交互式过渡对象在一个视图控制器消失和另一个视图控制器出现之间驱动自定义动画。它依赖一个过渡动画代理(一个采用UIViewControllerAnimatorTransitioning 协议的自定义对象)来设置和执行动画。

没有UIViewControllerAnimatorTransitioning 协议。假设是一个错误,或者是在 iOS 7 开发过程中发生的名称更改,实际上是UIViewControllerAnimatedTransitioning 协议,我们如何将交互控制器与动画控制器联系起来?我想这是驱动转换的视图控制器的责任,但我没有看到任何 API 来建立这个链接,所以这意味着 UIPercentDrivenInteractiveTransition 确实是为 Apple 类保留的?

【问题讨论】:

  • 您找到解决方案了吗?
  • 我最终从头开始编写自己的交互式过渡,正如下面其他 cmets 所暗示的那样,我不使用 UIPercentDrivenInteractiveTransition。
  • 您能解释一下您是如何使您的自定义容器与新的 iOS7 过渡 API 兼容的吗?我目前正在尝试做同样的事情。问题是,我不知道要调用哪些方法或遵循哪些协议才能完成这项工作。不过,我对“常见”用例(presentViewController、自定义 navigationController 转换)的 API 本身非常熟悉。
  • 没关系。我自己想通了。实际上这很容易。谢谢你的帖子:)

标签: ios uiviewcontroller containers transition interactive


【解决方案1】:

我正在尝试自己做同样的事情,并最终编写了自己的 UIPercentDrivenInteractiveTransition 等效项。似乎百分比驱动的过渡要求动画并在交互式过渡开始后实际启动它。不过,取消时我在实现反向动画时遇到了一些麻烦。

【讨论】:

  • 这也是我最终所做的。对于取消,我播放与取消之前已经发生的事情对称的动画。棘手的部分是在容器中重建正确的视图控制器层次结构并再次调用所有willMoveToParentViewController: 系列回调。此外,它还导致我对beginAppearanceTransition: / endAppearanceTransition 的调用不平衡...而与交互式过渡并行的导航栏动画是另一项工作!
  • 根据容器视图控制器的性质,您在转换时并不总是需要调用willMoveToParentViewControllercallbacks。例如,UITabBarControllerviewDidLoad 中进行这些调用,但在更改选项卡时不会。你是怎么玩那些对称的取消动画的?通过复制图层中的所有动画,删除它们然后重新添加副本?
  • 我不知道百分比驱动的交互式事务真正起作用的魔法是什么。我实现了自己的交互式过渡,根据 percentComplete 参数移动事物。然后,如果我完成了过渡,我会从 percentComplete 的当前值到 1 开始一个动画。如果我取消过渡,我会从 percentComplete 的当前值到 0 开始一个动画。真的没什么难的,但是写了很多.
猜你喜欢
  • 1970-01-01
  • 2014-02-13
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 2015-01-17
相关资源
最近更新 更多