我对一个简洁的示例感兴趣,该示例说明了如何创建一个实现UIViewControllerInteractiveTransitioning
协议的NSObject
子类来管理两个UIViewController
之间的自定义交互式转换。 理想情况下,响应滑动手势。类似于现在附带的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--more
2(使用UIViewControllerAnimatedTransitioning
的功能animateTransition
进行交互转换。它会自动分区为"关键帧",这要归功于您之前对updateInteractiveTransition
的调用。但我想如果你实现了你的startInteractiveTransition:
UIViewControllerInteractiveTransitioning
方法(所以不使用UIPercentDrivenInteractiveTransition
子类(,那么你有责任管理完全过渡(不确定......对不起,但在我看来文档不是很清楚(。
Apple现在确实提供了一个示例项目,说明如何实现这一目标。话虽如此,我不认为这是最好/最清晰的例子,但它应该让你走上正确的道路。
他们还有一个WWDC视频,带你完成这个项目。
请注意,这是一个相当复杂的例子,但如果你设法把它拆开并理解各个部分,你应该有能力或多或少地处理过渡方面的任何事情。
从本质上讲,该项目将问题拆分为两个帮助程序类,1( 使用视图控制器初始化并在视图控制器的生命周期内存在的AssetTransitionController
,以及 2( 在转换开始时创建并在过渡期间存在的AssetTransitionDriver
对象。
AssetTransitionController
相当简单,它符合UIViewControllerAnimatedTransitioning
和UIViewControllerInteractiveTransitioning
管理AssetTransitionDriver
的生命周期。
AssetTransitionDriver
是一个简单的NSObject
子类,但实际上最终要复杂得多。它管理主UIViewPropertyAnimator
,为过渡创建视图层次结构,并响应交互驱动程序(平移手势识别器(。它还会在要求时将其动画师提供给AssetTransitionController
。
它根本不使用UIPercentDrivenInteractiveTransition
。