导航控制器的侧滑返回与全屏滑动返回功能


侧滑返回做法1:

前提条件:采用系统默认的返回按钮
弊端:必须从屏幕左侧的边缘滑动才会实现侧滑返回功能 [LS](https://pan.baidu.com/s/1skV1WOP 密码 zr7w)

  • 代码:
// 直接调用系统的push方法,无需我们写pop时的代码
[self.navigationController pushViewController:vc1 animated:NO];
  • 演示:


    101.131.gif

侧滑返回做法2:

前提条件:自定义导航栏返回按钮
弊端:必须从屏幕左侧的边缘滑动才会实现侧滑返回功能

  • 代码:自定义导航栏返回按钮
#import "ZBNavController.h"
@interface ZBNavController ()<UINavigationControllerDelegate>
@property (nonatomic ,strong) id PopVCDelegate;
@end

@implementation ZBNavController
#warning 程序初始运行先执行pushViewController,方法执行完毕,才真真正正激情根控制器添加到屏幕上。然后加到屏幕时候,立刻调用navigationController,整个过程一气呵成.
- (void)viewDidLoad {
    [super viewDidLoad];
    // 导航控制器成为自己的代理。【必不可少,已验证】
    // 既然任何类的对象都能成为导航控制器的代理,那么自己成为导航控制器的代理,有何不可呢?再者:成为代理,必须得遵守协议,设置代理对象是谁,实现代理方法,这三大核心步骤缺一不可。
    self.delegate = self;
}
// 将要push到某个控制器的时候调用。参数viewController表示要push的控制器
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    
    if (self.childViewControllers.count != 0) {
         NSLog(@"非根控制器");
    //加载图片
    UIImage *image = [[UIImage imageNamed:@"NavBack"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
            // 自定义导航栏的返回按钮
            viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:image style:0 target:self action:@selector(back)];
    }
    //只要重写了pushViewController方法,里面一定要有这行代码,否则就不能实现控制器之间的跳转(入栈和出栈)
    [super pushViewController:viewController animated:animated];
}
- (void)back {
    // 返回上一级
    [self popViewControllerAnimated:YES];
}

// 代理方法:导航控制器的View显示完毕时调用。 参数viewController要显示的控制器
-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    
    //判断当前显示的控制器是否为根控制器.
    if(self.childViewControllers.count == 1) {
        //是根控制器,设回手势代理。否则侧滑没反应,所以也就无法pop到上一级控制器。[已验证]
        self.interactivePopGestureRecognizer.delegate = self.PopVCDelegate;
    }
}
@end
101.132.gif


全屏滑动返回


#import "ZBNavController.h"

@interface ZBNavController ()<UIGestureRecognizerDelegate>
@end

@implementation ZBNavController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 滑动的手势
    // 只要我们触发滑动的手势(滑动屏幕),系统就会调用self.interactivePopGestureRecognizer.delegate的handleNavigationTransition:方法,实现全屏返回功能。
    // 系统底层帮我们实现了handleNavigationTransition:方法,我们只需要调用即可。
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];
    // 让当前控制器成为滑动手势的代理
    pan.delegate = self;
    [self.view addGestureRecognizer:pan];//给窗口的根控制器的view添加手势
}

//代理方法。判断是否开始响应手势,返回类型为BOOL.
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {// C
    //当前控制器是否为根控制器
        if(self.childViewControllers.count == 1) {// 根控制器
            return NO;// 拖动屏幕没有反应,即不会发生返回
        }else {// 非根控制器
            return YES;// 拖动屏幕有反应,即会发生返回
        }
}
@end

101.130.gif

拓展:自定义导航栏背景颜色,导航栏字体颜色,字体大小

  • 代码:
#import "ZBNavController.h"
@interface ZBNavController ()
@end

@implementation ZBNavController

- (void)viewDidLoad {
    [super viewDidLoad];
}
// 某个类或者子类重写了系统的initialize方法,只有在用这个类创建出对象的情况下,才会调用initialize方法,可能调用过多次
+ (void)initialize {

    if (self == [ZBNavController class]) {
        //获取整个应用程序下所有的导航条.
        //UINavigationBar *bar = [UINavigationBar appearance];
        
        //获取指定类下面的导航条
        UINavigationBar *bar = [UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[[ZBNavController class]]];
        
        //导航条的背景图片
        [bar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault];
   
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        // 导航栏的字体颜色
        //根据可变字典中的key(即NSForegroundColorAttributeName),取出value,即使右边的[UIColor whiteColor]
        dict[NSForegroundColorAttributeName] = [UIColor whiteColor];
        // 导航栏的字体大小
        dict[NSFontAttributeName] = [UIFont boldSystemFontOfSize:20];
        [bar setTitleTextAttributes:dict];
    }
    
    
}
@end
  • 演示:


    101.132.gif

遇到的bug

  • 出现的问题1:pop控制器的时候,有竖直的黑影
101.128.gif
  • 解决办法:给黑影所在的控制器设置背景颜色。

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor orangeColor];
}

101.129.gif

参考部分链接


独立的导航控制器NavigationBar之间切换效果

实现的效果:pop时二级界面的导航栏不会消失隐藏.[LS](https://pan.baidu.com/s/1gfOBbUz 密码 8tma)

系统默认切换效果(共用一个导航条)

101.140.gif

自定义切换效果(两个独立的导航条)

101.134.gif


显示/隐藏navigationBar

  • 在要push的控制器的viewWillAppear方法中设置navigationBar的隐藏或者显示
// 在viewWillAppear实现显示/隐藏navigationBar
-(void)viewWillAppear:(BOOL)animated{
self.navigationController.navigationBar.hidden = YES;
}
101.136.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 下一篇相关文章:UINavigationBar手势侧滑、隐藏bar、UIScrollView侧滑返回研究二 前言i...
    独孤流阅读 2,836评论 2 10
  • 黎明咋见时, 星星仍落在草原。 我逆着光, 看见你向我走来, 恍惚中看不见你的脸, 却感受到你的离去。 我惊醒, ...
    云沐阅读 228评论 3 1
  • 明天就是母亲节了,办公室里都在讨论怎么过母亲节,下午早早的来到教室,突然看到一个小视频,灵机一动,给学生策划一个母...
    董晋莹阅读 320评论 0 0
  • 各位亲爱的书友好:《长恨歌》共读时间:6月1日-6月15日今天我们的共读目标是王安忆《长恨歌》的第三部第四章。 今...
    江离菲菲阅读 738评论 2 3