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

Ios 使用UIViewControllerInteractiveTransitioning委托协议实现自定义UIViewController交互转换的正确方法,ios,objective-c,uiviewcontroller,ios7,Ios,Objective C,Uiviewcontroller,Ios7,我感兴趣的是一个简明的示例,它演示了如何创建一个NSObject子类,该子类实现UIViewControllerInteractiveTransitioning协议来管理两个UIViewController之间的自定义交互转换。理想情况下,这是对滑动手势的响应。类似于iOS7默认交互滑动的东西,现在随UINavigationController提供,但这是一个自定义/手动实现示例 我读过文件: 并查看了其他地方的一些示例: (我对此进行了设置,但更多是关于UIViewCont

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

我读过文件:

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

  • (我对此进行了设置,但更多是关于
    UIViewController
    containment
    和手动实现这些转换,而不是
    UIViewControllerInteractiveTransitioning
文档相当清晰,但没有参考示例代码。示例还有一点不尽如人意(关于如何将各个部分连接在一起的未回答问题)

因此,我的问题是:

  • 是否有人可以帮助填写有关如何将手势(例如,滑动)绑定到实现
    UIViewControllerInteractiveTransitioning
    协议的对象的空白
  • 实现UIViewControllerInteractiveTransitioning协议的对象与实现UIViewControllerInimatedTransitioning协议的对象之间的关系是什么?似乎必须同时具备这两个条件才能触发交互式转换
  • 提前感谢…

    1)将手势绑定到
    UIViewControllerInteractiveTransition
    对象的最简单方法是使其成为
    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;
          }
        }
    }
    
    -(无效)把手英寸:(UIPinchGestureRecognitor*)捏{
    CGFloat scale=pinch.scale;
    开关(夹点状态){
    案例UIgestureRecognitzerStateStart:{
    _startScale=比例;
    self.interactive=是;
    [self.navigationController PopViewControllerInitiated:是];
    打破
    }
    案例UIgestureRecognitzerStateChanged:{
    CGFloat百分比=(1.0-刻度/标准刻度);
    [self-updateInteractiveTransition:(百分比<0.0)?0.0:百分比];
    打破
    }
    案例UIgestureRecognitzerStateEnded:{
    CGFloat百分比=(1.0-刻度/标准刻度);
    
    BOOL cancelled=([pinch velocity]<5.0&&percent苹果确实为您提供了一个如何实现这一点的好方法。尽管如此,我认为这不是最好/最清晰的例子,但它应该让您走上正确的道路

    他们也有一个可以带领你完成这个项目的方法

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

    本质上,该项目将问题分为两个助手类,1)使用视图控制器初始化并在其生命周期内存在的
    AssetTransitionController
    ,以及2)在转换开始时创建并在转换期间存在的
    AssetTransitionDriver
    对象

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

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


    它根本不使用
    UIPercentDrivenInteractiveTransition

    我刚刚看到一个具有不同自定义转换的iOS7示例应用程序,也许你可以从中获得灵感:查看此帖子:和相关代码:你的示例代码已关闭/找不到。感谢大家的提醒,很抱歉,我刚刚取下了几个几天前,repo已备份,或从未关闭,我记不起发生了什么,可能是我更改了repo的名称或其他什么。无论如何,它现在就在那里。如果您实现startInteractiveTransition:method,则永远不会调用animatettransition(调试了数小时,感谢您的想法)