AJ学IOS 之微博项目实战(6)导航控制器NavigationController 的滑动回退功能实现
来源:互联网 发布:fgo下载完整数据卡住 编辑:程序博客网 时间:2024/06/05 14:12
AJ分享,必须精品
一:效果
第二篇里面写了怎样自定义navigation实现自定义的导航控制器左右按钮样式,但是当我们自己实现后,系统自带的向右边滑动来实现回退的功能就不能用了。
这里主要实现滑动回退功能
。
二:代码实现思路
首先 在 NYNavigationController.m中放一个popDelegate来放置要更改的手势代理对象
@interface NYNavigationController ()<UINavigationControllerDelegate>@property (nonatomic, strong) id popDelegate;@end
重写 UINavigationControllerDelegate 的方法- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
viewDidLoad中设置代理方法,并且预先设置手势代理用来还原
- (void)viewDidLoad { [super viewDidLoad]; //记住手势代理 用来还原 _popDelegate = self.interactivePopGestureRecognizer.delegate; self.delegate = self;}
//导航控制器跳转完成的控制器- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{ if (viewController == self.viewControllers[0]) { // 是根控制器 //还原手势代理 self.interactivePopGestureRecognizer.delegate = _popDelegate; }else{ // 非根控制器 //设置手势代理为空,就可以实现滑动了 //实现滑动返回功能 //清空滑动返回手势的代理,就能实现滑动返回功能了。 self.interactivePopGestureRecognizer.delegate = nil; }}
三: 全部navigationController的代码
内部包括设置左右按钮等等功能
//// NYNavigationController.m// Created by apple on 15-7-29.// Copyright (c) 2015年 znycat. All rights reserved.//#import "NYNavigationController.h"#import "UIBarButtonItem+Item.h"@interface NYNavigationController ()<UINavigationControllerDelegate>@property (nonatomic, strong) id popDelegate;@end@implementation NYNavigationController+ (void)initialize{ // 获取当前类下面的UIBarButtonItem UIBarButtonItem *item = [UIBarButtonItem appearanceWhenContainedIn:self, nil]; // 设置导航条按钮的文字颜色 为黄色 NSMutableDictionary *titleAttr = [NSMutableDictionary dictionary]; titleAttr[NSForegroundColorAttributeName] = [UIColor orangeColor]; [item setTitleTextAttributes:titleAttr forState:UIControlStateNormal];}- (void)viewDidLoad { [super viewDidLoad]; //记住手势代理 用来还原 _popDelegate = self.interactivePopGestureRecognizer.delegate; self.delegate = self;}-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{ [super pushViewController:viewController animated:animated]; // 设置非根控制器导航条内容 if (self.viewControllers.count != 0) { //非根控制器 //设置导航条的内容 //设置导航条左边和右边 //如果把导航条上的返回按钮覆盖了,那么就没有了滑动返回功能 //设置左边按钮 viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"navigationbar_back"] highImage:[UIImage imageNamed:@"navigationbar_back_highlighted"] target:self action:@selector(backToPre) forControlEvents:UIControlEventTouchUpInside]; //设置右边按钮 viewController.navigationItem.rightBarButtonItem = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"navigationbar_more"] highImage:[UIImage imageNamed:@"navigationbar_more_highlighted"] target:self action:@selector(backToRoot ) forControlEvents:UIControlEventTouchUpInside]; }}-(void)backToPre{ //返回上一个控制器 [self popViewControllerAnimated:YES];}-(void)backToRoot{ //返回根控制器 [self popToRootViewControllerAnimated:YES];}#pragma mark - UINavigationControllerDelegate 实现滑动回退功能//导航控制器跳转完成的控制器- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{ if (viewController == self.viewControllers[0]) { // 是根控制器 //还原手势代理 self.interactivePopGestureRecognizer.delegate = _popDelegate; }else{ // 非根控制器 //设置手势代理为空,就可以实现滑动了 //实现滑动返回功能 //清空滑动返回手势的代理,就能实现滑动返回功能了。 self.interactivePopGestureRecognizer.delegate = nil; }}@end
四:注意
设置手势代理为空后必须要在该用的时候给设置回去,系统内部东西不能随便乱改,要么会出现难以预料的bug。在跟控制器的时候不小心做了回退滑动那样的操作会让再次进入下一个页面的导航控制器的右边按钮点击无效,app就崩溃了。
self.interactivePopGestureRecognizer.delegate = nil;
0 0
- AJ学IOS 之微博项目实战(6)导航控制器NavigationController 的滑动回退功能实现
- 猫猫学iOS 之微博项目实战(6)导航控制器NavigationController 的滑动回退功能实现
- AJ学IOS 之微博项目实战(2)微博主框架-自定义导航控制器NavigationController
- AJ学IOS 之微博项目实战(1)微博主框架-子控制器的添加
- 猫猫学iOS 之微博项目实战(2)微博主框架-自定义导航控制器NavigationController
- AJ学IOS 之微博项目实战(7)程序启动新特性用UICollectionViewController实现
- Swift - 导航控制器(navigationController)全屏滑动返回功能实现
- AJ学IOS 之微博项目实战(11)发送微博自定义TextView实现带占位文字
- AJ学IOS 之微博项目实战(12)发送微博自定义工具条代理实现点击事件
- AJ学IOS 之微博项目实战(4)微博自定义tabBar中间的添加按钮
- AJ学IOS 之微博项目实战(13)发送微博调用相机里面的图片以及调用相机
- AJ学IOS 之微博项目实战(5)微博自定义搜索框searchBar
- AJ学IOS 之微博项目实战(10)微博cell中图片的显示以及各种填充模式简介
- AJ学IOS 之微博项目实战(8)用AFNetworking和SDWebImage简单加载微博数据
- AJ学IOS 之微博项目实战(3)微博主框架-UIImage防止iOS7之后自动渲染_定义分类
- AJ学IOS 之微博项目实战(9)微博模型之时间相关重要操作,判断刚刚,昨天,今年等等
- AJ学IOS(23)UI之控制器管理
- AJ学IOS(17)UI之纯代码自定义Cell实现新浪微博UI
- AJ学IOS 之微博项目实战(3)微博主框架-UIImage防止iOS7之后自动渲染_定义分类
- AJ学IOS 之小知识之xcode6自动提示图片插件 KSImageNamed的安装
- AJ学IOS 之小知识之_xcode插件的删除方法_自动提示图片插件KSImageNamed有时不灵_分类或宏之类不能自动提示,
- AJ学IOS 之微博项目实战(4)微博自定义tabBar中间的添加按钮
- AJ学IOS 之微博项目实战(5)微博自定义搜索框searchBar
- AJ学IOS 之微博项目实战(6)导航控制器NavigationController 的滑动回退功能实现
- AJ学IOS 之微博项目实战(7)程序启动新特性用UICollectionViewController实现
- AJ学IOS 之微博项目实战(8)用AFNetworking和SDWebImage简单加载微博数据
- AJ学IOS 之第一次打开Xcode_git配置,git简单学习
- AJ学IOS 之CoreLocation基本使用
- AJ学IOS 之CoreLocation指南针小应用
- AJ学IOS 之CoreLocation地理编码小Demo输入城市得到经纬度
- eclipse添加ADT插件步骤
- AJ学IOS 之CoreLocation反地理编码小Demo输入经纬度得到城市