iOS 7 自定义Back按钮 与 Pop interactive gesture

1、自定义Back按钮

iOS中很多时候我们都会自定义返回按钮,也是一件easy的事,类似如下:


 // 返回按钮
1 - (void)showNavBackButton
2 {
3 UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
4 [backButton addTarget:self action:@selector(backButtonAction:)
5 forControlEvents:UIControlEventTouchUpInside];
6 [backButton setBackgroundImage:[UIImage imageNamed:@"00_back_button"]
7 forState:UIControlStateNormal];
8 [backButton setTitle:kLoc(@"Back") forState:UIControlStateNormal];
9 [backButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 1, 0)];
10 backButton.titleLabel.font = kMediumFont(12);
11 backButton.frame = CGRectMake(0, 0, 51, 31);
12 self.navigationItem.leftBarButtonItem
13 = [[UIBarButtonItem alloc] initWithCustomView:backButton];
14 }

但是,这样在iOS7下Pop interactive gesture就不好使了。

这里 Here 有一个解决方法。

但是,测试发现在栈中推入一个controller后,快速向左平滑,将会引起崩溃。

查看崩溃日志,发现如下信息:

?





1

nested pop animation can result in corrupted navigation bar

2、解决Pop interactive gesture问题

优化的解决方案是简单的让NavigationController自己成为响应的接受者,最好用一个UINavigationController的子类。

1)在过渡的时候禁用interactivePopGestureRecognizer

2)当新的视图控制器加载完成后再启用,建议使用UINavigationController的子类操作


 // 自定义NavigationController
1 @interface DCBaseNavigationController ()
2 <
3 UINavigationControllerDelegate,
4 UIGestureRecognizerDelegate
5 >
6 @end
7
8 @implementation DCBaseNavigationController
9
10 - (void)dealloc
11 {
12 self.interactivePopGestureRecognizer.delegate = nil;
13 self.delegate = nil;
14
15 [super dealloc];
16 }
17
18 #pragma mark - View lifecycle
19
20 - (void)viewDidLoad
21 {
22 [super viewDidLoad];
23 // Do any additional setup after loading the view.
24
25 if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
26 self.interactivePopGestureRecognizer.delegate = self;
27 self.delegate = self;
28 }
29 }
30
31 - (void)didReceiveMemoryWarning
32 {
33 [super didReceiveMemoryWarning];
34 // Dispose of any resources that can be recreated.
35 }
36
37 #pragma mark - Override
38
39 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
40 {
41 // Hijack the push method to disable the gesture
42 if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
43 self.interactivePopGestureRecognizer.enabled = NO;
44 }
45
46 [super pushViewController:viewController animated:animated];
47 }
48
49 #pragma mark - UINavigationControllerDelegate
50
51 - (void)navigationController:(UINavigationController *)navigationController
52 didShowViewController:(UIViewController *)viewController
53 animated:(BOOL)animate
54 {
55 if ([navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
56 navigationController.interactivePopGestureRecognizer.enabled = YES;
57 }
58 }
59
60 @end

3、Pop interactive gesture冲突,造成页面假死问题

我遇到的情况是,Push/Pop页面时,没有立即得到想要的效果,页面没有显出出来,NavigationController的didShowViewController:回调方法也没有调用。

页面布局情况是这样的:视图A,有一个Pan手势;视图B是TabBarController,其ViewControllers都是NavigationController。视图B是视图A的子视图。

后来找到原因是:navigationController的interactive
pop手势与视图A的pan手势冲突。

具体原因是:rootViewController加载时,调用了didShowViewController:,设置interactivePopGestureRecognizer可用,其实我们并不需要在root的时候也触发这个手势。所以稍加优化如下:


 // 优化
1 - (void)navigationController:(UINavigationController *)navigationController
2 didShowViewController:(UIViewController *)viewController
3 animated:(BOOL)animate
4 {
5 if ([navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
6 //if ([[navigationController.viewControllers firstObject] isEqual:viewController]) {
7 if ([navigationController.viewControllers count] == 1) {
8 // Disable the interactive pop gesture in the rootViewController of navigationController
9 navigationController.interactivePopGestureRecognizer.enabled = NO;
10 } else {
11 // Enable the interactive pop gesture
12 navigationController.interactivePopGestureRecognizer.enabled = YES;
13 }
14 }
15 }

当前显示的是root时,设置interactivePopGestureRecognizer不可用,非root时设置interactivePopGestureRecognizer可用。

参考文章:http://keighl.com/post/ios7-interactive-pop-gesture-custom-back-button/

iOS 7 自定义Back按钮 与 Pop interactive gesture,码迷,mamicode.com

时间: 04-28

iOS 7 自定义Back按钮 与 Pop interactive gesture的相关文章

ios 设置所有 导航控制器 的返回按钮 自定义导航按钮

应用场景: 1.当导航控制器push很多次,每个自控制器都需要自定义返回按钮,很麻烦 2.当进入二级界面以后,需要隐藏底部的tabbar 3.一次性设置顶部导航条的颜色 解决方法: 自定义导航控制器,重写push(跳到下一个控制器) 和 pop(返回上一个控制器) 方法 代码: #import "SGNavigationController.h" @interface SGNavigationController () @end @implementation SGNavigation

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

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

iOS 笔记-自定义的导航栏按钮

暂时记录一个小知识点,因为赶着做项目,后续会慢慢补充 self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"侧栏" style:UIBarButtonItemStylePlain target:self action:@selector(clickleftButton:)]; 如果我们使用这行代码来定义按钮,无论左边右边,图片还是文字,他都会把字体或图片颜色变成默认的蓝色,然而并不

iOS开发- 自定义遮罩视图(引导, 功能说明)源码+解析

iOS开发- 自定义遮罩视图(引导, 功能说明)源码+解析 我们平时使用App的时候, 经常在第一次使用的时候, 会有类似"新手教程"之类的东西, 来引导我们应该如何使用这个App. 但是这个"新手教程"不同于常规的引导页(引导页指第一次打开App时候, 弹出的那种介绍视图. 他是静态的, 不需要与用户交互, 可以直接一页页翻, 或者直接跳过.)所谓的"新手教程", 就是按照App的提示, 一步步跟着完成. 那这个"新手教程"

自定义返回按钮后的滑动手势

自定义返回按钮是开发工作中很常见的需求,只需要一行代码就可以搞定: self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"back"] style:(UIBarButtonItemStyleDone) target:self action:@selector(backClick)]; 然后实现这个监听方法: - (void)backClick

iOS关于自定义rightBarButtonItem

在常见iOS开发中,我们常遇到这样的需求,如下: 我们需要自定义导航栏右侧按钮,常见的自定义包装按钮如下: //设置rightItem; UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; btn.frame = CGRectMake(0, 0, 40, 30); btn.selected = NO; [btn setTitle:@"管理" forState:UIControlStateNormal]; [btn

【iOS】自定义TabBarController

一.自定义的思路 iOS中的TabBarController确实已经很强大了,大部分主流iOS应用都会采用.但是往往也不能满足全部的需求,因此需要自定义TabBar,自定义需要对系统的TabBar工作方式有很好的理解,自定义需要勇气. 自定义TabBar的原则:尽量利用系统自带TabBar,只改需要改的地方. 二.自定义TabBar的总体过程 1.先把自带的TabBar条给取消了 2.自己做一个view,上面放几个按钮,设定按钮的点击事件.并设置selectIndex. 3.关联各个子viewC

iOS开发自定义时间选取器

又是一年的暑假日期而至,小孩子放假,都会到在外打工的父母身边.孩子想父母,父母也思念着自己的孩子.我身边的亲戚朋友的孩子 也都来了.这个暑假又该热闹起来. 努力什么时候都不晚 我有一个表妹,今年参加完高考,对自己的成绩不是特别满意.上次我回老家,刚好她给我一起来上海.准备来上海锻炼一下. 车上我问她,准备去哪上学?她说不想上了,想打工.我没有怎么劝她,我想让她体验一下打工的生活,她就知道还是上学好. 一个高中生,出来找工作,困难可想而知.经姐姐介绍,进了一家餐厅工作.工资也不是很高.干了两天,我

[IOS]swift自定义uicollectionviewcell

刚刚接触swift以及ios,不是很理解有的逻辑,导致某些问题.这里分享一下swift自定义uicollectionviewcell 首先我的viewcontroller不是直接继承uicollectionviewcontroller,而是添加的uicollectionview到我的storyboard, 然后再新建一个swift的文件,让这个swift继承uicollectionviewcell import Foundation class SVGCell :UICollectionView