iOS 开发 右滑返回上一级控制器

#import <objc/runtime.h>

@interface UINavigationController (Transition)<UIGestureRecognizerDelegate>

 

- (void)transitionPanGestureDidLoad;

 

@end

 

@interface DLNavigationTransition ()

 

@end

 

@implementation DLNavigationTransition

 

/**

 *  启动右滑pop

 */

+ (void)enableNavigationTransitionWithPanGestureBack

{

 

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        

        Method viewDidLoadMethod = class_getInstanceMethod([UINavigationController class], @selector(viewDidLoad));

        Method transitionPanGestureDidLoadMethod = class_getInstanceMethod([UINavigationController class], @selector(transitionPanGestureDidLoad));

        

        method_exchangeImplementations(viewDidLoadMethod, transitionPanGestureDidLoadMethod);

        

    });

}

 

@end

 

 

@implementation UINavigationController (Transition)

 

- (void)transitionPanGestureDidLoad

{    

    if ([self isKindOfClass:[UINavigationController class]])

    {

        

        [self transitionPanGestureDidLoad];

 

        

        //1.获取系统interactivePopGestureRecognizer对象的target对象

        id target = self.interactivePopGestureRecognizer.delegate;

        //2.创建滑动手势,taregt设置interactivePopGestureRecognizer的target,所以当界面滑动的时候就会自动调用target的action方法。

        //handleNavigationTransition是私有类_UINavigationInteractiveTransition的方法,系统主要在这个方法里面实现动画的。

        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] init];

        [pan addTarget:target action:NSSelectorFromString(@"handleNavigationTransition:")];

        //3.设置代理

        pan.delegate = self;

        //4.添加到导航控制器的视图上

        [self.view addGestureRecognizer:pan];

        

        //5.禁用系统的滑动手势

        self.interactivePopGestureRecognizer.enabled = NO;

    }

}

 

#pragma mark - 滑动开始会触发

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

{

    UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;

    

    CGPoint translat = [pan translationInView:pan.view];

    if (translat.x < 0 ) {

        return NO;

    }

    //只有导航的根控制器不需要右滑的返回的功能。

    if (self.viewControllers.count <= 1)

    {

        

        return NO;

    }

    

    return YES;

}

 

@end

 //直接上代码  等你来拷贝

转载于:https://www.cnblogs.com/tryFighting/p/8289324.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值