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

Alf*_*sen 44 objective-c uiviewcontroller ios ios7

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

我已经阅读了文档:

并在其他地方看了几个例子:

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

文档相当清楚,但不引用示例代码.这些例子还有一些不足之处(关于各个部分如何捆绑在一起的未解答的问题).

所以我的问题是:

  1. 有人可以帮助填补关于如何将手势(例如滑动)绑定到实现UIViewControllerInteractiveTransitioning协议的对象的空白吗?
  2. 实现UIViewControllerInteractiveTransitioning协议的对象与实现UIViewControllerAnimatedTransitioning协议的对象之间有什么关系?好像你必须要同时触发交互式转换......

提前致谢...

Mat*_*oal 12

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;
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

2)功能animateTransition的UIViewControllerAnimatedTransitioning用于执行交互式过渡.由于您之前的呼叫,它会自动在"关键帧"中进行分区updateInteractiveTransition.但我想如果你实现你的startInteractiveTransition:方法UIViewControllerInteractiveTransitioning(所以不使用UIPercentDrivenInteractiveTransition子类)那么你有责任管理完全过渡(不确定那个......抱歉,但我认为文档并不是很清楚).


Tri*_*cky 6

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

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

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

本质上,项目将问题分为两个辅助类,1)AssetTransitionController用视图控制器初始化,并且在视图控制器的生命周期中存在,2)AssetTransitionDriver在开始时创建的对象,并且存在持续时间. ,过渡.

该AssetTransitionController是相当简单的,它符合UIViewControllerAnimatedTransitioning和UIViewControllerInteractiveTransitioning管理的生命周期AssetTransitionDriver.

这AssetTransitionDriver是一个简单的NSObject子类,但实际上最终会复杂得多.它管理main UIViewPropertyAnimator,为转换创建视图层次结构,并响应交互驱动程序(平移手势识别器).它还会根据AssetTransitionController要求将其动画师出售.

它根本不使用UIPercentDrivenInteractiveTransition.