全屏滑动返回

作者: 尕小天 | 来源:发表于2016-07-25 20:24 被阅读110次

    1.导航控制器自带了滑动返回(iOS7)

    2.但是设置界面没有滑动返回功能

    3.恢复滑动返回

    分析:为什么滑动返回失效—>覆盖了系统的返回按钮—>怎么才能让滑动返回失效

    滑动返回实现原理:添加pan手势

    怎么让手势失效:代理方法可以让界面不能与用户交互....

    分析发现系统是通过代理让滑动返回失效的

    解决办法:清空代理

    4.全屏滑动返回

    系统自带的是屏幕边缘滑动返回,与需求不符

    我们要自己写一个滑动返回?  太麻烦

    系统已经有了,把系统的拿过来改一下

    5.怎么修改?

    先找到对应的手势,和手势的代理,  怎么找??

    滑动返回是导航控制器的功能,那么手势应该在导航控制器里面

    在导航控制器头文件中搜索gesture,我们找到interactivePopGestureRecognizer

    我们通过打印它可以得到一些信息

    ; target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7fb413d0c460>)>>

    在信息中我们可以找到代理,而且知道系统的手势是UIScreenEdgePanGestureRecognizer边缘手势

    6.怎么修改为全屏滑动

    修改手势方法为UIPanGestureRecognizer

    清除系统的边缘滑动手势

    手势方法调用系统的滑动返回方法,handleNavigationTransition:

    设置代理为自己,不让代理方法失效

    target的action滑动返回功能

    // 干掉系统边缘滑动手势

    self.interactivePopGestureRecognizer.enabled=NO;

    // 创建UIPanGestureRecognizer:滑动返回功能

    idtarget =self.interactivePopGestureRecognizer.delegate;

    UIPanGestureRecognizer*pan = [[UIPanGestureRecognizeralloc]initWithTarget:targetaction:@selector(handleNavigationTransition:)];

    [self.viewaddGestureRecognizer:pan];

    // 设置代理,控制手势什么时候触发

    pan.delegate=self;

    // 每次触发手势,询问下代理是否触发手势

    - (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldReceiveTouch:(UITouch*)touch

    {

    // 判断下是否是非控制器,如果是非根控制器就返回YES

    returnself.childViewControllers.count>1;

    }

    相关文章

      网友评论

      • 路在脚下了:能不能上传一个demo:blush:
        路在脚下了:@尕小天 谢谢你:blush:
        尕小天:@码海求知 先自定义导航控制器

        然后写代码:
        - (void)viewDidLoad
        {
        [super viewDidLoad];
        self.interactivePopGestureRecognizer.enabled = NO;

        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];
        pan.delegate = self;
        // NSLog(@"'%@",[self.interactivePopGestureRecognizer.delegate class]);
        [self.view addGestureRecognizer:pan];
        }

        - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
        {
        // NSLog(@"%@",gestureRecognizer);
        // NSLog(@"%lu",self.childViewControllers.count);
        if (self.childViewControllers.count >1) {
        return YES;
        }
        return NO;
        }

      本文标题:全屏滑动返回

      本文链接:https://www.haomeiwen.com/subject/mrfnjttx.html