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

我感兴趣的是如何创build一个实现UIViewControllerInteractiveTransitioning协议来pipe理两个UIViewController之间的自定义交互转换的NSObject子类的简洁示例。 理想情况下,响应滑动手势。 类似于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–更多;

2) UIViewControllerAnimatedTransitioning函数animateTransition用于执行交互转换。 由于您先前调用了updateInteractiveTransition它会自动在“关键帧”中进行分区。 但我想,如果你实现了UIViewControllerInteractiveTransitioning (所以不使用UIPercentDrivenInteractiveTransition子类)的startInteractiveTransition:方法,那么你有责任pipe理完全过渡(不知道这个..抱歉,但我认为文档不是很清楚)。