UINavigationController 返回手势与 leftBarButtonItem
UINavigationController 返回手势与 leftBarButtonItem
UINavigationController 自带从屏幕左侧边缘向右滑动的返回手势,可以通过这个手势实现 pop,或者 pop 中途取消 pop 而停留在当前控制器(UIViewController)。如果设置了当前控制器的 navigationItem.leftBarButtonItem 或 navigationItem.leftBarButtonItems,则返回手势失效。可以通过自定义 NavigationController,实现设置 navigationItem.leftBarButtonItem 或 navigationItem.leftBarButtonItems,并且保留返回手势。代码已上传 GitHub:https://github.com/Silence-GitHub/NavigationControllerDemo
UINavigationController 的 interactivePopGestureRecognizer 属性为返回手势。设置手势的 delegate,手动管理返回手势。当 UINavigationController 没有或只有一个子控制器时,返回手势不能响应,否则会出现奇怪的现象。自定义 currentNotRootVC 属性,记录当前的非根子控制器(只有一个子控制器时,此子控制器为根子控制器,root view controller)。设置 UINavigationController 的 delegate,通过 UINavigationControllerDelegate 的方法,更新 currentNotRootVC。代码示例如下
import UIKit
class NavigationController: UINavigationController, UINavigationControllerDelegate, UIGestureRecognizerDelegate {
// Current child view controller, but not root view controller
private var currentNotRootVC: UIViewController?
override func viewDidLoad() {
super.viewDidLoad()
delegate = self
interactivePopGestureRecognizer?.delegate = self
}
// MARK: - UINavigationControllerDelegate
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
currentNotRootVC = viewControllers.count <= 1 ? nil : viewController
/*
switch viewController {
case is SomeVCClassForbidPopGesture:
interactivePopGestureRecognizer?.isEnabled = false
default:
interactivePopGestureRecognizer?.isEnabled = true
}
*/
}
// MARK: - UIGestureRecognizerDelegate
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
if interactivePopGestureRecognizer == gestureRecognizer {
// Begin to pop only when top view controller is current child view controller but not root view controller
return currentNotRootVC == topViewController
}
return true
}
}
如果有部分控制器不允许返回手势(例如编辑信息,退出页面需要确认),则在func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool)
方法中,加入对 viewController 的判断,开启或禁用返回手势。
参考:http://www.cnblogs.com/v2m_/p/3521569.html
转载请注明出处:http://www.cnblogs.com/silence-cnblogs/p/6618056.html
UINavigationController 返回手势与 leftBarButtonItem的更多相关文章
- iOS学习—— UINavigationController的返回按钮与侧滑返回手势的研究
侧滑返回手势是从iOS7开始增加的一个返回操作,经历了两年时间估计iPhone用户大部分都已经忽略了屏幕左上角那个碍眼的back按钮了.之前在网上搜过有关侧滑手势的技术博客,发现大多比较散乱,甚至有很 ...
- iOS 如何设置导航的滑动返回手势, 和系统饿一样
iOS 7 滑动返回那些事儿 2014/05/17 Wei .entry-meta .entry-header 在智能机越来越普及,屏幕越做越大的当下,滑动返回手势已经成为了一个应用的标配功能,甚至可 ...
- App开发流程之右滑返回手势功能续
上一篇记录了利用系统私有变量和方法实现右滑返回手势功能:http://www.cnblogs.com/ALongWay/p/5893515.html 这篇继续记录另一种方案:利用UINavigatio ...
- App开发流程之右滑返回手势功能
iOS7以后,导航控制器,自带了从屏幕左边缘右滑返回的手势功能. 但是,如果自定义了导航栏返回按钮,这项功能就失效了,需要自行实现.又如果需要修改手势触发范围,还是需要自行实现. 广泛应用的一种实现方 ...
- 第十三篇、Swift_Nav自定义返回按钮后或者隐藏导航栏,Pop返回手势失效的解决方法 Pop全局返回添加的方法
边缘的pop返回手势: override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.purple ...
- 第二十六篇、因为自定item(nav)而使系统右滑返回手势失效的解决方法
@interface ViewController () <uigesturerecognizerdelegate> @end@implementation ViewController ...
- iOS开发之自定义导航栏返回按钮右滑返回手势失效的解决
我相信针对每一个iOS开发者来说~除了根视图控制器外~所有的界面通过导航栏push过去的界面都是可以通过右滑来返回上一个界面~其实~在很多应用和APP中~用户已经习惯了这个功能~然而~作为开发者的我们 ...
- iOS定义自己的回报button(它不影响返回手势)
这种方法可以定义为返回到其button,它不影响返回手势. 新方法: self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] ...
- iOS自己定义返回button(不影响返回手势)
此方法能够自己定义返回button,且不影响返回手势. 新方法: self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] in ...
随机推荐
- 用IFeatureWorkspaceAnno.CreateAnnotationClass 创建注记图层时报“The application is not licensed to modify or create schema”的错误的解决方案。
用IFeatureWorkspaceAnno.CreateAnnotationClass 的方法创建注记图层的时候报"The application is not licensed to m ...
- JavaScript闭包基本概念
闭包的概念 维基百科中是这么解释闭包的: 计算机科学中,闭包(也称为词法闭包或函数闭包)是指一个函数或函数的引用,与一个引用环境绑定在一起.这个函数环境是一个存储该函数每个非局部变量(也叫自由变量)的 ...
- Java JTS & 空间数据模型
空间数据模型 判断两个几何图形是否存在指定的空间关系.包括: 相等(equals).分离(disjoint).相交(intersect).相接(touches).交叉(crosses).包含于(wit ...
- bzoj 4824: [Cqoi2017]老C的键盘
Description 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 ...
- 深入学习rollup来进行打包
深入学习rollup来进行打包 阅读目录 一:什么是Rollup? 二:如何使用Rollup来处理并打包JS文件? 三:设置Babel来使旧浏览器也支持ES6的代码 四:添加一个debug包来记录日志 ...
- hashCode花式卖萌
声明:这篇博文纯属是最近看源码时闲着没事瞎折腾(好奇心驱动),对实际的应用程序编码我觉得可能没有那么大的帮助,各位亲就当是代码写累了放松放松心情,视为偏门小故事看一看就可以了,别深究. 一.从Obje ...
- 随便说说 post-processing
九月份一篇博都没更新,这段时间一直在unity的坑里爬不起来,感觉真的很绝望啊,仿佛对生活都失去了信心. 渲染问题并没有解决,目前方案只是减轻视觉冲突,降低违和感.项目AR产品也做的越来越艰难,开始经 ...
- vue 自定义指令directive
//自定义指令:directive 的传参--可以数据也可以是字符串 Vue.directive('scroll', function (binding) { window.addEventListe ...
- 解决反序列化(Deserialize)无法找到程序集的错误
http://blog.csdn.net/w_s_q/article/details/5677536 在使用.NET序列化对象时,会将程序集信息也包含进去.如果将序列化之后的字节数组通过网络(或其他传 ...
- Fiddler如何模拟弱网环境进行测试
1.模拟弱网环境 打开Fiddler,Rules->Performance->勾选 Simulate Modem Speeds,勾选之后访问网站会发现网络慢了很多 2.Fiddler弱网的 ...