我相信针对每一个iOS开发者来说~除了根视图控制器外~所有的界面通过导航栏push过去的界面都是可以通过右滑来返回上一个界面~其实~在很多应用和APP中~用户已经习惯了这个功能~然而~作为开发者的我们~也并没有为此做些什么~因为我们在创建项目时~苹果公司已经为我们都做好了~那么~我们这期就来聊一聊这系统自带的右滑方法以及如何修改和拦截这个不被重视的方法~

什么时候会被拦截

当我们使用代码或者用storyboard来创建一个新的控制器的时候~我们很少注意导航栏的leftItem~因为正常情况下~push到下一个界面的leftItem就是上一个界面的self.title~并且它也就是一个返回的功能~所以~我们很少去在意这些~但当我们有些需求~需要自定义leftItem的时候~那么问题就来了~

  • 问题一:怎么自定义leftItem
  • 问题二:为什么系统自带的右滑返回手势失效
  • 问题三:怎么解决这个失效问题

1.怎么自定义leftItem

其实~这个东西嘛~说简单也是很简单的~因为~我们很明确的知道~左导航栏就一个功能~那就是返回上一个界面~很显然~是需要用户交互的~必用按钮~
说多了都是废话~直接上代码~
//自定义一个按钮
UIButton *leftBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [leftBtn setTitle:@"返回" forState:UIControlStateNormal];
[leftBtn addTarget:self action:@selector(backLastView) forControlEvents:UIControlEventTouchUpInside];
leftBtn.frame = CGRectMake(0, 0, 60, 40);
[leftBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
//将leftItem设置为自定义按钮
UIBarButtonItem *leftItem =[[UIBarButtonItem alloc]initWithCustomView: leftBtn];
self.navigationItem.leftBarButtonItem = leftItem;

//按钮点击事件 返回上一个界面
- (void)backLastView{
[self.navigationController popViewControllerAnimated:YES];
}

需要注意的是~xcode自动从6.0之后~leftItem距左屏幕边距有16个像素点~这样会导致在视觉上会感觉有点偏右~不算美观~然而对于大多数处女座的程序员来说~这明显是不能让人去接受的~解决办法有很多~在这里提供一个最为方便的方法~设置一下按钮的contentEdgeInsets(文字)imageEdgeInsets(图片)属性即可~如:leftButton.contentEdgeInsets = UIEdgeInsetsMake(0, -16, 0, 0);

2.为什么系统自带的右滑返回手势失效
这也是我一直所关系的问题~还希望知道的可以私信我~
笨笨编程官方微博
[http://weibo.com/2728581591/profile?rightmod=1&wvr=6&mod=personnumber]
qq:2638006336

3.怎么解决这个失效问题
其实很简单很简单~只需要添加下面这一句代码即可
self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;

其实到这里~问题应该都解决了~但是~毕竟右滑返回手势只能靠近屏幕左边缘才能使用~我们如何通过调用系统方法来实现在整个屏幕右滑就可以实现返回功能呢~
setp1:需要获取系统自带滑动手势的target对象
id target = self.navigationController.interactivePopGestureRecognizer.delegate;
setp2:创建全屏滑动手势~调用系统自带滑动手势的target的action方法
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
step3:设置手势代理~拦截手势触发
pan.delegate = self;
step4:别忘了~给导航控制器的view添加全屏滑动手势
[self.view addGestureRecognizer:pan];
step5:将系统自带的滑动手势禁用
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
steo6:还记得刚刚设置的代理吗?下面方法什么时候调用?在每次触发手势之前都会询问下代理,是否触发。
这个方法就是拦截手势触发的方法.
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{}
return NO;则不需要触发滑动手势
return YES;则需要触发滑动手势

iOS开发之自定义导航栏返回按钮右滑返回手势失效的解决的更多相关文章

  1. 关于iOS自定义返回按钮右滑返回手势失效的解决:

    在viewDidLoad方法里面添加下面这一句代码即可 self.navigationController.interactivePopGestureRecognizer.delegate=(id)s ...

  2. 解决 ios7.0 以后自定义导航栏左边按钮靠右的问题

    解决 ios7.0 以后自定义导航栏左边按钮靠右的问题 www.111cn.net 编辑:edit02_lz 来源:转载 最近开发了一个ios的app,在ios7.0+出现自定义导航栏左边按钮出现靠右 ...

  3. IOS开发中设置导航栏主题

    /** * 系统在第一次使用这个类的时候调用(1个类只会调用一次) */ + (void)initialize { // 设置导航栏主题 UINavigationBar *navBar = [UINa ...

  4. IOS开发之——自定义导航控制器

    BasicNavigationViewController:UINavigationViwController /* 隐藏导航底部线条 */ -(void)viewDidLoad{    [super ...

  5. iOS开发-网易滚动导航栏

    HACursor,是一个对横向ScrollView中的视图进行管理的UI控件.只要几行代码就可以集成类似于网易新闻对主题页面进行排序,删除操作的功能.主srollview参考iOS原生的UITable ...

  6. ios开发之--首页 导航栏隐藏 下一级页面显示,pop回来显示白条

    解决方法,在首页中实现如下两个方法,代码如下: -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated] ...

  7. iOS 自定义导航栏笔记

    一.UINavigationBar的结构 导航栏几乎是每个页面都会碰到的问题,一般两种处理方式:1.隐藏掉不显示 2.自定义 1. 添加导航栏 TestViewController * mainVC ...

  8. UINavigationController-自定义导航栏标题按钮.

    见视频0416 自定义导航栏标题按钮,在Bar Button Item中加入UIButton,设置UIButton的图片和标题,还可以自定义自定义UIButton实现特效按钮.

  9. iOS系统右滑返回全局控制方案

    前言 今天有个小需求,在点击导航条上的返回按钮之前要调用某个API,并弹出UIAlertView来显示,根据用户的选项判断是否是返回还是继续留在当前控制器.举个简单的例子,当点击导航条上的左上角返回按 ...

随机推荐

  1. 浅谈Servlet读取Html参数

    1首先:webApp名称为cookieAndsession.html文件一般放在WebRoot文件夹下:/cookieAndsession/WebRoot/OrderForm.html,那么外界要访问 ...

  2. MongDb添加嵌套文档

         想添加嵌套文档,就需要创建2个实体类.如下图 usermodel.Student = student; 其中Student的类型就是StudentModel: 第一个实体类         ...

  3. 11-C语言指针

    目录: 一.指针 二.指针与数组 回到顶部 一.指针 1 内存被分为字节,每个字节有唯一地址,指针保存的是内存中的地址. 2 保存指针的变量,就叫指针变量,(保存地址) 3 声明一个指针变量 int ...

  4. IOS 表视图(UITableVIew)的使用方法(4)自定义表视图单元

    UITableViewCell的自定义往往需要自建一个UITableViewCell的子类后进行作业.开发者可以选择通过xib或者直接在UITableViewCell的布局中进行UITableView ...

  5. javaScript中有关正则表达式的用法总结

    js中处理正则表达式的类:RegExp 用法: var reg=new RegExp("express"); 或者: var reg=/express/; js中常用的6个方法: ...

  6. Docker学习总结之Run命令介绍

    Docker学习总结之Run命令介绍 本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 在使用Docker时,执行最多的命令某 ...

  7. JAVA GUI学习 - JOptionPane对话框组件学习

    /** * 对话框 - 学习笔记 * @author Wfei * */ public class JoptionPaneKnow extends JFrame { public JoptionPan ...

  8. hdoj 1269 迷宫城堡(强连通分量)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1269 思路分析:该问题要求判断是否每两个房间都可以相互到达,即求该有向图中的所有点是否只构成一个强连通 ...

  9. Flex 内置验证器—验证用户输入

    今晚对于Flex中的Validator类(所有验证器的父类)测试一下 ---->其中常用的验证类有StringValidator,NumberValidator,DateValidator 测试 ...

  10. 意大利奢侈品牌-Kiton 华丽进驻北京新光天地-时尚生活-泛高尔夫网

    意大利奢侈品牌-Kiton 华丽进驻北京新光天地-时尚生活-泛高尔夫网 意大利奢侈品牌-Kiton 华丽进驻北京新光天地