3

我目前正在尝试构建自己的自定义 ContainerViewController。

我对 iOS ViewController 包含 API(在 iOS 5 中引入)和新的 iOS7 ViewController Transition API 非常熟悉。

在实现我的容器时,我尝试使用 UINavigationController 和 UITabBarController 正在使用的相同模式。

到目前为止,我的容器运行良好,并且可以正确使用动画和交互式过渡。

问题是,我将大量逻辑打包到我的 UIViewController 容器子类中。它符合<UIViewControllerContextTransitioning>并使用 iVar 来存储该协议方法返回的所有值。

动画和交互逻辑已经在另一个类中分离,第三方也能够使用类似于UINavigationControllerDelegateand的委托提供自己的转换UITabBarControllerDelegate

我现在要做的是将其外包UIViewControllerContextTransitioning给一个单独的类,以创建与 Apple 为其 containerVC 所做的相同的模块化。Apple 为传递给和方法UIViewControllerOneToOneTransitionContext的对象提供了一个(私有 API) 。所以他们没有为此使用他们的 UIViewController 子类。(这就是我现在所做的)id<UIViewControllerContextTransitioning>UIViewControllerAnimatedTransitioningUIViewControllerInteractiveTransitioning

到目前为止,我目前的结构很诱人,因为当转换逻辑在上下文中调用[updateInteractiveTransition:],[completeTransition:]等时,这些调用直接在我的 containerController 上进行,然后可以通过更新其视图中的其他元素来响应。(就像 UINavigationController 在您调用时所做的那样[updateInteractiveTransition:],它正在更新 NavigationBar 的内容(交叉淡入淡出))。

在另一个类中外包上下文转换逻辑意味着:

  • 提供从容器到上下文对象的容器堆栈中保存的视图控制器和框架等,因为上下文需要将它们提供给转换逻辑。
  • 从容器上的上下文对象调用转换回调,因为上下文对象是从转换逻辑接收它们的对象。

由于Apple使用这种类关系,我想它一定有一些优势。目前,我不知道是否应该保留我的实现,或者尝试使其像 Apple 提供的容器一样模块化。

另请参阅这个SO -我问过同样事情的问题。(更像是一个答案问题,对此感到抱歉:/)

当我们讨论这个话题时:是否可以让我的容器与 UIPercentDrivenInteractiveTransition 一起使用?文档说它会在关键帧中剪切由 transitionAnimator 执行的动画,并逐步自动“重播”动画过渡,所以我怀疑它是否可以与自定义容器一起使用。

谢谢你的帮助 !

4

1 回答 1

1

Apple 使用许多符合某些协议的小类来移交工作。分而治之。看看例如 UITableView 操作或集合视图的方式。他们确实将事物分成了尽可能小的块,并为每个块提供了一些通用对象。这些对象仅符合某些协议。

  • 不要强迫人们进行子类化。
  • 创建履行某些角色的类必须遵守的协议。
  • 您想在哪里创建将执行某些操作的即用型对象 - 返回对象的 id 类型,而不是类对象。这是保持事情足够简单和灵活的唯一方法。Apple 甚至使用既是类又是协议的 NSObject 来做到这一点。创建自己的协议时,请记住使它们符合 NSObject * 协议。

您的问题比较长,并没有提出任何具体问题,所以我希望这能回答您的一些担忧。如果没有,请随时发布一个来回应这个问题。

于 2014-04-30T16:02:17.460 回答