zoukankan      html  css  js  c++  java
  • UINavigationController实现全屏滑动返回功能

    说明: 

    UINavigationController默认在push出的控制器中都有边沿滑动返回功能,但是只能从屏幕左边滑才能返回,若从屏幕中间画并没有效果。下面实现全屏滑动功能。

    探究:

    系统默认能够实现滑动返回是因为UINavigationController具有interactivePopGestureRecognizer,所以我们可以使用NSLog打印出它的全部信息如下

    <UIScreenEdgePanGestureRecognizer: 0x7fdf4a431c70; state = Possible; enabled = NO; delaysTouchesBegan = YES; view = <UILayoutContainerView 0x7fdf4a791830>; target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7fdf4a4314e0>)>>
    

    从打印信息可以看出

    • interactivePopGestureRecognizer的真实类型为UIScreenEdgePanGestureRecognizer(屏幕边沿手势)
    • 手势调用的方法为handleNavigationTransition:
    • 手势的Target对象的类型为_UINavigationInteractiveTransition

    实现思想:

    给UINavigationController的view添加滑动手势pan,替换掉系统的手势,并在触发pan手势时调用系统的方法。

    实现难点:

    • 系统手势调用方法,(通过打印信息以获得)
    • target对象 通过加断点调试查看系统手势的target和系统手势的代理发现他们的类型和地址都相同,说明系统手势的代理即为系统手势的target。 

    实现代码:

    - (void)viewDidLoad {
        [super viewDidLoad];
    
       // 获取系统手势的target对象
        id tagart = self.interactivePopGestureRecognizer.delegate;
        // 创建手势调用系统的方法
        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget: tagart action:@selector(handleNavigationTransition:)];
        // 添加手势
        [self.view addGestureRecognizer:pan];
        // 设置手势的代理
        pan.delegate = self;
        // 禁能系统的手势
        self.interactivePopGestureRecognizer.enabled = NO;
    }
    
    // 手势的代理方法
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        // 非根控制器使能手势
        return self.childViewControllers.count > 1;
    }
    

    注意点:

    在手势的代理方法中要判断是否是跟控制器,如果是根控制器要禁能手势

    • 因为手势会触发滑动返回,若是根控制器则无法返回,就会出现假死的bug
  • 相关阅读:
    虚拟机安装Mac OS X ----- VM12安装Mac OS X
    windows7 64位安装mysql 5.7.11 zip压缩版
    sublime text 3 + python配置,完整搭建及常用插件安装
    Windows下虚拟机安装Mac OS X ----- VM12安装Mac OS X 10.11
    myeclipse 2014新建maven web 项目步骤
    解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.
    static{}语句块详解
    http状态码代表含义
    Android权限列表permission说明
    【MySQL】10条SQL优化语句,让你的MySQL数据库跑得更快!
  • 原文地址:https://www.cnblogs.com/mengfei90/p/5210517.html
Copyright © 2011-2022 走看看