iOS 7的手势滑动返回功能
Posted 「违规用户」
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 7的手势滑动返回功能相关的知识,希望对你有一定的参考价值。
版权声明:本文为博主原创文章,未经博主允许不得转载。
隐藏navigationController的navigationBar后,系统自带的左边侧滑pop手势就消失了。
之前随手写过一篇《使用UIScreenEdgePanGestureRecognizer实现swipe to pop效果》,挺粗糙的。
现在使用默认模板创建的ios App都支持手势返回功能,如果导航栏的返回按钮是自定义的那么则会失效,也可以参考这里手动设置无效。
[cpp] view plain copy- if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
- self.navigationController.interactivePopGestureRecognizer.enabled = NO;
如果是因为自定义导航按钮而导致手势返回失效,那么可以在NavigationController的viewDidLoad函数中添加如下代码: [cpp] view plain copy
- - (void)viewDidLoad
- [super viewDidLoad];
- // Do any additional setup after loading the view.
- __weak typeof (self) weakSelf = self;
- if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
- self.interactivePopGestureRecognizer.delegate = weakSelf;
这样写了以后就可以通过手势滑动返回上一层了,但是如果在push过程中触发手势滑动返回,会导致导航栏崩溃(从日志中可以看出)。针对这个问题,我们需要在pop过程禁用手势滑动返回功能: [cpp] view plain copy
- - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
- // fix 'nested pop animation can result in corrupted navigation bar'
- if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
- self.interactivePopGestureRecognizer.enabled = NO;
- [super pushViewController:viewController animated:animated];
[cpp] view plain copy
- - (void)navigationController:(UINavigationController *)navigationController
- didShowViewController:(UIViewController *)viewController
- animated:(BOOL)animated
- if ([navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
- navigationController.interactivePopGestureRecognizer.enabled = YES;
除了使用系统默认的动画,还可以使用自定义过渡动画( 丰满的文档): [cpp] view plain copy
- - (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
- animationControllerForOperation:(UINavigationControllerOperation)operation
- fromViewController:(UIViewController *)fromVC
- toViewController:(UIViewController *)toVC
- if (operation == UINavigationControllerOperationPop)
- if (self.popAnimator == nil)
- self.popAnimator = [WQPopAnimator new];
- return self.popAnimator;
- return nil;
- - (id<UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController
- interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransitioning>)animationController
- return self.popInteractionController;
- #pragma mark -
- - (void)enablePanToPopForNavigationController:(UINavigationController *)navigationController
- UIScreenEdgePanGestureRecognizer *left2rightSwipe = [[UIScreenEdgePanGestureRecognizer alloc]
- initWithTarget:self
- action:@selector(didPanToPop:)];
- //[left2rightSwipe setDelegate:self];
- [left2rightSwipe setEdges:UIRectEdgeLeft];
- [navigationController.view addGestureRecognizer:left2rightSwipe];
- self.popAnimator = [WQPopAnimator new];
- self.supportPan2Pop = YES;
- - (void)didPanToPop:(UIPanGestureRecognizer *)panGesture
- if (!self.supportPan2Pop) return ;
- UIView *view = self.navigationController.view;
- if (panGesture.state == UIGestureRecognizerStateBegan)
- self.popInteractionController = [UIPercentDrivenInteractiveTransition new];
- [self.navigationController popViewControllerAnimated:YES];
- else if (panGesture.state == UIGestureRecognizerStateChanged)
- CGPoint translation = [panGesture translationInView:view];
- CGFloat d = fabs(translation.x / CGRectGetWidth(view.bounds));
- [self.popInteractionController updateInteractiveTransition:d];
- else if (panGesture.state == UIGestureRecognizerStateEnded)
- if ([panGesture velocityInView:view].x > 0)
- [self.popInteractionController finishInteractiveTransition];
- else
- [self.popInteractionController cancelInteractiveTransition];
- self.popInteractionController = nil;
如下这个代理方法是用来提供一个非交互式的过渡动画的: [cpp] view plain copy
- - (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
- animationControllerForOperation:(UINavigationControllerOperation)operation
- fromViewController:(UIViewController *)fromVC
- toViewController:(UIViewController *)toVC
- if (operation == UINavigationControllerOperationPop)
- if (self.popAnimator == nil)
- self.popAnimator = [WQPopAnimator new];
- return self.popAnimator;
- return nil;
- self.navigationItem.hide Back Button = YES 并在 iOS 7 上使用滑动手势返回