46

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

我已阅读文档:

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

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

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

所以我的问题是:

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

提前致谢...

4

2 回答 2

13

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)animateTransition的函数UIViewControllerAnimatedTransitioning用于执行交互转换。由于您之前对updateInteractiveTransition. 但我想如果你实现你的startInteractiveTransition:方法UIViewControllerInteractiveTransitioning(所以不使用UIPercentDrivenInteractiveTransition子类),那么你有责任管理完全转换(不确定..对不起,但我认为文档不是很清楚)。

于 2014-01-11T23:20:19.323 回答
7

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

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

请注意,这是一个相当复杂的示例,但是如果您确实设法将其分解并理解了各个部分,那么您应该具备处理过渡前沿的或多或少的任何事情的能力。

本质上,该项目将问题分为两个帮助类,1)一个AssetTransitionController由视图控制器初始化并在其生命周期内存在,以及 2)一个AssetTransitionDriver在开始时创建并存在于, 一个过渡。

AssetTransitionController相当简单,它符合UIViewControllerAnimatedTransitioningUIViewControllerInteractiveTransitioning管理AssetTransitionDriver.

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

它根本不使用UIPercentDrivenInteractiveTransition

于 2018-08-08T17:51:39.847 回答