猫猫学iOS 之微博项目实战(6)导航控制器NavigationController 的滑动回退功能实现

猫猫分享,必须精品

原创文章,欢迎转载。转载请注明:翟乃玉的博客

地址:http://blog.csdn.net/u013357243

一:效果

第二篇里面写了怎样自定义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;

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 15:59:37

猫猫学iOS 之微博项目实战(6)导航控制器NavigationController 的滑动回退功能实现的相关文章

猫猫学iOS 之微博项目实战(1)微博主框架-子控制器的添加

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 一:简单介绍 这是新浪微博的iOS端项目,来自于黑马的一个实战项目.(本人没有培训,纯属自学,但人要学会感恩,虽然是自己买的学习资料,但是饮水思源!!) 主要分成五大模块,本次全部运用纯代码实现,其中会用到很多前面学过得内容,如果有的地方有重复的知识点,说明这个知识点真的很重要,没有时间看视频学习或者培训的朋友们,可以看猫猫的

猫猫学iOS 之微博项目实战(2)微博主框架-自己定义导航控制器NavigationController

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 一:加入导航控制器 上一篇博客完毕了对底部的TabBar的设置,这一章我们完毕自己定义导航控制器(NYNavigationController). 为啥要做自己定义呢.由于为了更好地封装代码,而且系统的UINavigationController不能满足我们的需求了,所以得自己定义. 首先,我们在NYTabBarViewCon

猫猫学iOS 之微博项目实战(2)微博主框架-自定义导航控制器NavigationController

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 一:添加导航控制器 上一篇博客完成了对底部的TabBar的设置,这一章我们完成自定义导航控制器(NYNavigationController). 为啥要做自定义呢,因为为了更好地封装代码,并且系统的UINavigationController不能满足我们的需求了,所以得自定义. 首先,我们在NYTabBarViewContro

猫猫学iOS 之微博项目实战(8)用AFNetworking和SDWebImage简单加载微博数据

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:效果 没有图文混排,也没有复杂的UI,仅仅是简单的显示出微博数据,主要介绍AFNetworking和SDWebImage的简单用法 二:加载数据AFNetworking AFNetworking用法 AFNetworking的用法大体有三步: 一:下载第三方框架(githup也好,百度也好,多的是) 二:导入头文件 #import "AFNetworking

猫猫学iOS 之微博项目实战(5)微博自己定义搜索框searchBar

猫猫分享.必须精品 原创文章.欢迎转载. 转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:效果 用UITextField简单定义一个搜索框 二:调用: 调用的代码.非常easy,直接init就能够,以后加功能自己加入即可了. - (void)viewDidLoad { [super viewDidLoad]; // 创建搜索框 NYSearchBar *searchBar = [[NYSearchBar alloc] initWithFrame

猫猫学iOS 之微博项目实战(4)微博自定义tabBar中间的添加按钮

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:效果图 自定义tabBar实现最下面中间的添加按钮 二:思路 首先在自己的tabBarController中把系统的tabBar设置成自己的tabBar(NYTabBar),这里由于tabBar的属性是readonly的,所以我们要用kvc或者是消息管理来设置他 然后就写自己的NYTabBar.这个写起来首先 遍历当前tabBar上的所有view,如果是UI

猫猫学iOS 之微博项目实战(5)微博自定义搜索框searchBar

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:效果 用UITextField简单定义一个搜索框 二:调用: 调用的代码,很简单,直接init就可以,以后加功能自己添加就行了. - (void)viewDidLoad { [super viewDidLoad]; // 创建搜索框 NYSearchBar *searchBar = [[NYSearchBar alloc] initWithFrame:CGR

猫猫学iOS 之微博项目实战(10)微博cell中图片的显示以及各种填充模式简介

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 :一效果 如果直接设置会有拉伸等等的状况,这里主要介绍图片显示的一些细节 二:代码 代码实现其实很简单,微博当中用了一个photos来存放九宫格这些图片,然后用了一个photo类来做每个photo,并且在上面显示gif等的样式,很多很多小技巧,直接上代码 九宫格根据行列设置等算法,不难 #import "HWStatusPhotosView.h" #i

猫猫学iOS 之微博项目实战(12)发送微博自定义工具条代理实现点击事件

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:效果 二:封装好的工具条 NYComposeToolbar.h 带代理方法 #import <UIKit/UIKit.h> typedef enum { NYComposeToolbarButtonTypeCamera, // 拍照 NYComposeToolbarButtonTypePicture, // 相册 NYComposeToolbarButto