使用UIViewControllerInteractiveTransitioning实现自定义UIViewController交互转换的正确方法委托协议
我感兴趣的是如何创build一个实现UIViewControllerInteractiveTransitioning
协议来pipe理两个UIViewController
之间的自定义交互转换的NSObject
子类的简洁示例。 理想情况下,响应滑动手势。 类似于iOS7的默认交互式滑动,现在与UINavigationController
,但是这是一个自定义/手动实现的例子。
我已阅读文档:
- UIViewControllerContextTransitioning
- UIPercentDrivenInteractiveTransition
- UIViewControllerInteractiveTransitioning
- UIViewControllerAnimatedTransitioning
并在其他地方看了几个例子:
- 一
- 二
- 三
- 四 (我设置了这个,但它更多的是关于
UIViewController
containment
和手动实现这些转换,而不是UIViewControllerInteractiveTransitioning
文档相当清楚,但不参考示例代码。 而且这些例子还有一些不足之处(关于各个部分是如何连接在一起的未解答的问题)。
所以我的问题是:
- 有人可以帮助填补关于如何将手势(例如滑动)绑定到实现
UIViewControllerInteractiveTransitioning
协议的对象的空白吗? - 实现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理完全过渡(不知道这个..抱歉,但我认为文档不是很清楚)。