我目前正在尝试构建自己的自定义 ContainerViewController。
我对 iOS ViewController 包含 API(在 iOS 5 中引入)和新的 iOS7 ViewController Transition API 非常熟悉。
在实现我的容器时,我尝试使用 UINavigationController 和 UITabBarController 正在使用的相同模式。
到目前为止,我的容器运行良好,并且可以正确使用动画和交互式过渡。
问题是,我将大量逻辑打包到我的 UIViewController 容器子类中。它符合<UIViewControllerContextTransitioning>
并使用 iVar 来存储该协议方法返回的所有值。
动画和交互逻辑已经在另一个类中分离,第三方也能够使用类似于UINavigationControllerDelegate
and的委托提供自己的转换UITabBarControllerDelegate
。
我现在要做的是将其外包UIViewControllerContextTransitioning
给一个单独的类,以创建与 Apple 为其 containerVC 所做的相同的模块化。Apple 为传递给和方法UIViewControllerOneToOneTransitionContext
的对象提供了一个(私有 API) 。所以他们没有为此使用他们的 UIViewController 子类。(这就是我现在所做的)id<UIViewControllerContextTransitioning>
UIViewControllerAnimatedTransitioning
UIViewControllerInteractiveTransitioning
到目前为止,我目前的结构很诱人,因为当转换逻辑在上下文中调用[updateInteractiveTransition:]
,[completeTransition:]
等时,这些调用直接在我的 containerController 上进行,然后可以通过更新其视图中的其他元素来响应。(就像 UINavigationController 在您调用时所做的那样[updateInteractiveTransition:]
,它正在更新 NavigationBar 的内容(交叉淡入淡出))。
在另一个类中外包上下文转换逻辑意味着:
- 提供从容器到上下文对象的容器堆栈中保存的视图控制器和框架等,因为上下文需要将它们提供给转换逻辑。
- 从容器上的上下文对象调用转换回调,因为上下文对象是从转换逻辑接收它们的对象。
由于Apple使用这种类关系,我想它一定有一些优势。目前,我不知道是否应该保留我的实现,或者尝试使其像 Apple 提供的容器一样模块化。
另请参阅这个SO -我问过同样事情的问题。(更像是一个答案问题,对此感到抱歉:/)
当我们讨论这个话题时:是否可以让我的容器与 UIPercentDrivenInteractiveTransition 一起使用?文档说它会在关键帧中剪切由 transitionAnimator 执行的动画,并逐步自动“重播”动画过渡,所以我怀疑它是否可以与自定义容器一起使用。
谢谢你的帮助 !