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
协议的对象的空白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(调试了数小时,感谢您的想法)