前言
先扯一会儿犊子
本文简介
见题知意 不再加以解释
我相信针对每一个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.为什么系统自带的右滑返回手势失效
这也是我一直所关心的问题,还希望知道的可以私信我
QQ:2638006336
3.怎么解决这个失效问题
其实很简单很简单~只需要添加下面这一句代码即可
self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
后来很多网友反馈这里还是有点问题的,具体文章已经更新,可以参考 这篇文章
或者直接联系我QQ也可以 *********(笨笨编程)
****写在结尾的话****
其实到这里,问题应该都解决了,但是,毕竟右滑返回手势只能靠近屏幕左边缘才能使用,我们如何通过调用系统方法来实现在整个屏幕右滑就可以实现返回功能呢
step1:需要获取系统自带滑动手势的target对象
id target = self.navigationController.interactivePopGestureRecognizer.delegate;
step2:创建全屏滑动手势~调用系统自带滑动手势的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;
step6:还记得刚刚设置的代理吗?下面方法什么时候调用?在每次触发手势之前都会询问下代理,是否触发。
这个方法就是拦截手势触发的方法.
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{}
return NO;则不需要触发滑动手势
return YES;则需要触发滑动手势
好啦好啦,差不多了,更多内容关注笨笨编程其他简书,这里有你将会更加精彩~
网友评论
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
} 这行代码 也不行..
你在哪里加的~哪一行代码~
这个以后 可以滑动返回了,但是来回滑动以后,偶尔会出现卡顿的现象。。好像是因为自定义nav导致的失效。有什么解决办法呢