滑动返回的延伸(全局滑动返回功能)

上一篇文章提到自定义导航条(NavigationBar)覆盖系统返回按钮,导致滑动功能消失的解决方法后,有朋友提出有时候会遇到一些别的要求,比如要设置一个全屏滑动返回的功能,顾名思义在屏幕任何位置都能实现右滑返回。

其实如果滑动功能的解决思路和过程,这个方案并不难实现,或者说比解决滑动功能消失更简单。首先我们可以先解决以下问题:为什么系统手势不能全屏?那我们可以把手势属性打印出来分析。

Edge是边缘的意思,那很有可能系统用这个方法只能控制边缘的滑动返回,我们可以点进去进一步观察。

可见 UIScreenEdgePanGestureRecognizer是继承于 UIPanGestureRecognizer,而且edges这个属性我们也可以确认就是用来控制边缘。那我们可以尝试直接点击进去,看看是否可以直接修改系统的东西实现我们的需求。

如图可见,值得我们参考的只有两个,一个是None,一个是All。字面意思可以推测,None是指没有边界,那意味着是无法滑动。All的话包括上下左右四个方向,即可以向任何方向滑动,也明显不符合我们需求。

所以,那就意味着我们眼下只能创建UIPanGestureRecognizer(下文pan手势替代),并把它加到导航控制器的view上,因为无论如何跳转,导航控制器都会在最底层,能够响应手势。

那我们不用系统手势,自己创建pan手势并添加。那么,下面我们只要实现功能即可。在实现功能之前要先注意到一个问题,我们的系统是否本来就已经存在滑动返回这个功能。既然系统的手势本来就有这个方法,我们也已经把手势添加到整个view上,那我们是否直接把系统的返回功能拿过来使用即可?那么我们再回到最初的打印。

其实第一次打印这个手势时,系统就已经把target和action给出,那就意味着我们可以直接使用,只需在创建时使用系统的target,就能直接调用系统的action方法实现返回功能。

但是这里可能会有个难点,就是我们。如何能拿到系统的target。因为该类我们不能通过方法直接创建(因为该类是私有的,即苹果没有把它暴露给我们,不能直接使用)。但是如上图我们可以注意到还有一个细节, _UINavigationInteractiveTransition和它的代理 self.interactivePopGestureRecognizer.delegate是同一种类型,虽然不是同一个对象,但是我们不用在意它们是否同一个对象,因为这方法是定义在类里面的。所以,我们可以定义一个“假”的target,只要是同一个类,就能调用该方法。

最后会报一个找不到方法的警告,可以忽略它,因为我本来就没有定义这个方法,只是想办法调用了系统本来就写好的方法。本次改动功能实现其实就4行代码,这里主要是提供一个思考过程和大家一起分享。

时间: 2024-10-06 13:19:00

滑动返回的延伸(全局滑动返回功能)的相关文章

iOS 自定义返回按钮,保留系统滑动返回

原文链接 自定义返回按钮保留系统滑动返回手势.gif 1.简介 使用苹果手机,最喜欢的就是用它的滑动返回.作为一个开发者,我们在编写很多页面的时候,总是会因为这样那样的原因使得系统的滑动返回不可用.使用导航栏push出一个控制器,我们在控制器中自定义了一个返回按钮.这样系统默认的滑动返回手势效果就没有了. 2.解决方法 [1]从A这个控制器push到B这个控制器,我们想要自定义B的返回按钮,我们可以在A中设置 self.navigationItem.backBarButtonItem = [[U

在UITableView中识别作用滑动,实现上下翻页的功能

目前有三种方案: 1. UIScrollView + UITableView. 实现方法,在UIScrollView中,加入UITableView即可 设置UIScrollView的代理和方法 - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ int currentPostion = scrollView.contentOffset.x; if (currentPostion - 0 > 50) { NSLog(@"Scroll

(原创)c#学习笔记06--函数02--变量的作用域02--参数和返回值与全局数据

6.2.2  参数和返回值与全局数据 本节将详细介绍如何通过全局数据以及参数和返回值与函数交换数据.先看看下面的代码: class Program { static void ShowDouble(ref int val) { val *= 2; Console.WriteLine("val doubled = {0}", val); } static void Main(string[] args) { int val = 5; Console.WriteLine("val

UITableView中识别左右滑动,实现上下翻页的功能

目前有三种方案: 1. UIScrollView + UITableView. 实现方法,在UIScrollView中,加入UITableView即可 设置UIScrollView的代理和方法 - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ int currentPostion = scrollView.contentOffset.x; if (currentPostion - 0 > 50) { NSLog(@"Scroll

spring boot 2 全局统一返回RESTful风格数据、统一异常处理

全局统一返回RESTful风格数据,主要是实现ResponseBodyAdvice接口的方法,对返回值在输出之前进行修改.使用注解@RestControllerAdvice拦截异常并统一处理. 开发环境:IntelliJ IDEA 2019.2.2jdk1.8Spring Boot 2.2.2 1.创建一个SpringBoot项目,pom.xml引用的依赖包如下 <dependency> <groupId>org.springframework.boot</groupId&g

完美解决ScrollView嵌套ViewPager滑动失效和无法正常滑动冲突问题

/******************************************************************************* * Copyright 2011, 2012 Chris Banes. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the Li

&lt;10&gt; 无参无返回值+ 无参有返回值函数的定义+有参无返回值函数定义+ 有参有返回值函数定义+函数的参数+函数的参数传递过程

无参无返回值: 1 #include <stdio.h> 2 3 4 /** 5 * 定义一个无参无返值函数 6 * 7 */ 8 void print_line(){ 9 10 printf("-----------------\n"); 11 12 } 13 14 15 16 int main(int argc, const char * argv[]) { 17 //调用函数 18 print_line(); 19 20 return 0; 21 } 无参有返回值函数

判断是否含有中文,包含返回true,不包含返回false

/** * 功能:判断是否含有中文,包含返回true,不包含返回false */ function isChina(s) { var patrn = /[\u4E00-\u9FA5]|[\uFE30-\uFFA0]/gi; if (!patrn.exec(s)) { return false; } else { return true; } }

返回类型和return语句:无返回值函数,有返回值函数,返回数组指针

重点: 1.return语句功能:终止当前正在执行的函数并将控制权返回到调用该函数的地方.Return语句两种形式: Return: Return expression; 2.返回void的函数不要求非得有return语句,因为在这类函数的最后一句后面会隐式地执行return. 3.Void函数如果想中间退出,可以使用return,作用相当于break,提前退出. 4.一个返回类型是void的函数也可以使用return expression形式,不过return语句的expression必须是另