使用 UIViewController交互式转换委托协议实现自定义 UIViewController 交互式转换的正确方



我对一个简洁的示例感兴趣,该示例说明了如何创建一个实现UIViewControllerInteractiveTransitioning协议的NSObject子类来管理两个UIViewController之间的自定义交互式转换。 理想情况下,响应滑动手势。类似于现在附带的iOS7默认交互式滑动 UINavigationController ,但这是一个自定义/手动实现示例。

我已经阅读了文档:

  • UIViewControllerContextTransitioning
  • UIPercentDrivenInteractiveTransition
  • UIViewControllerInteractiveTransitioning
  • UIViewControllerAnimatedTransitioning

并在其他地方查看了一些示例:

  • 四个(我设置了这个,但它更多的是关于这些转换的UIViewController containment和手动实现,而不是UIViewControllerInteractiveTransitioning

文档相当清晰,但不引用示例代码。这些例子还有一些不足之处(关于各个部分如何联系在一起的未回答问题(。

所以我的问题是:

  1. 有人可以帮助填补有关如何将手势(例如滑动(绑定到实现UIViewControllerInteractiveTransitioning协议的对象上的空白吗?
  2. 实现 UIViewControllerInteractiveTransitioning 协议的对象与实现 UIViewControllerAnimatedTransitioning 协议的对象之间的关系是什么?似乎您必须同时拥有两者才能触发交互式过渡......

提前感谢...

1(将手势绑定到UIViewControllerInteractiveTransitioning对象的最简单方法是使其成为UIPercentDrivenInteractiveTransition的子类。然后在实现笔势处理程序的地方,在此处调用updateInteractiveTransition:一个带有代码的示例:

-(void)handlePinch:(UIPinchGestureRecognizer *)pinch {
    CGFloat scale = pinch.scale;
    switch (pinch.state) {
      case UIGestureRecognizerStateBegan: {
          _startScale = scale;
          self.interactive = YES;
          [self.navigationController popViewControllerAnimated:YES];
          break;
      }
      case UIGestureRecognizerStateChanged: {
          CGFloat percent = (1.0 - scale/_startScale);
          [self updateInteractiveTransition:(percent < 0.0) ? 0.0 : percent];
          break;
      }
      case UIGestureRecognizerStateEnded: {
          CGFloat percent = (1.0 - scale/_startScale);
          BOOL cancelled = ([pinch velocity] < 5.0 && percent <= 0.3);
          if (cancelled) [self cancelInteractiveTransition];
          else [self finishInteractiveTransition];
          break;
      }
      case UIGestureRecognizerStateCancelled: {
          CGFloat percent = (1.0 - scale/_startScale);
          BOOL cancelled = ([pinch velocity] < 5.0 && percent <= 0.3);
          if (cancelled) [self cancelInteractiveTransition];
          else [self finishInteractiveTransition];
          break;
      }
    }
}

此代码来自 https://www.captechconsulting.com/blogs/ios-7-tutorial-series-custom-navigation-transitions--more

2(使用UIViewControllerAnimatedTransitioning的功能animateTransition进行交互转换。它会自动分区为"关键帧",这要归功于您之前对updateInteractiveTransition的调用。但我想如果你实现了你的startInteractiveTransition: UIViewControllerInteractiveTransitioning方法(所以不使用UIPercentDrivenInteractiveTransition子类(,那么你有责任管理完全过渡(不确定......对不起,但在我看来文档不是很清楚(。

Apple现在确实提供了一个示例项目,说明如何实现这一目标。话虽如此,我不认为这是最好/最清晰的例子,但它应该让你走上正确的道路。

他们还有一个WWDC视频,带你完成这个项目。

请注意,这是一个相当复杂的例子,但如果你设法把它拆开并理解各个部分,你应该有能力或多或少地处理过渡方面的任何事情。

从本质上讲,该项目将问题拆分为两个帮助程序类,1( 使用视图控制器初始化并在视图控制器的生命周期内存在的AssetTransitionController,以及 2( 在转换开始时创建并在过渡期间存在的AssetTransitionDriver对象。

AssetTransitionController相当简单,它符合UIViewControllerAnimatedTransitioningUIViewControllerInteractiveTransitioning管理AssetTransitionDriver的生命周期。

AssetTransitionDriver是一个简单的NSObject子类,但实际上最终要复杂得多。它管理主UIViewPropertyAnimator,为过渡创建视图层次结构,并响应交互驱动程序(平移手势识别器(。它还会在要求时将其动画师提供给AssetTransitionController

它根本不使用UIPercentDrivenInteractiveTransition

最新更新