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

时间:2013-09-23 20:51:44

标签: ios objective-c uiviewcontroller ios7

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

我已阅读文档:

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

  • one
  • two
  • three
  • four(我设置了它,但它更多地是关于UIViewController containment并且手动实现这些转换而不是UIViewControllerInteractiveTransitioning

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

所以我的问题是:

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

2 个答案:

答案 0 :(得分: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;
      }
    }
}

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

2) animateTransition的函数UIViewControllerAnimatedTransitioning用于执行交互式转换。您之前致电updateInteractiveTransition,它会自动在“关键帧”中进行分区。但我想如果你实现startInteractiveTransition: UIViewControllerInteractiveTransitioning方法(所以没有使用UIPercentDrivenInteractiveTransition子类),那么你有责任管理完全过渡(不确定那个......对不起,但是我认为文件不是很清楚)。

答案 1 :(得分:6)

Apple确实确实提供了example project,以说明如何实现此目的。话虽如此,我认为这不是最好/最清楚的例子,但是它应该可以使您走上正确的道路。

他们也有a WWDC video可以带您完成这个项目。

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

从本质上讲,该项目将问题分为两个帮助程序类:1)用视图控制器初始化并存在的<div id="test"></div>对象,以及2)一个AssetTransitionController对象是在过渡开始时创建的,并且在过渡期间一直存在。

AssetTransitionDriver非常简单,它符合管理AssetTransitionController生命周期的UIViewControllerAnimatedTransitioningUIViewControllerInteractiveTransitioning

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

它根本不使用AssetTransitionController