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
  • 相关阅读:
    Android 编程下 Eclipse 恢复被删除的文件
    Android 编程下背景图片适配工具类
    Android 编程下 Managing Your App's Memory
    Android 编程下代码之(QQ消息列表滑动删除)
    Android 编程下 Canvas and Drawables
    Android 编程下 AlarmManager
    Android 编程下去除 ListView 上下边界蓝色或黄色阴影
    Java 编程下字符串的 16 位、32位 MD5 加密
    C#枚举类型和int类型相互转换
    MVC和普通三层架构的区别
  • 原文地址:https://www.cnblogs.com/mengfei90/p/5210517.html
Copyright © 2011-2022 走看看