文档章节

iOS 自定义 NavigationController

GLAlanTong
 GLAlanTong
发布于 2017/01/14 16:26
字数 327
阅读 11
收藏 0

在实际项目中,经常需要自定义导航栏实现手势返回,当然还有很多其他的功能,自行参考就好,废话不多说,直接上代码

 创建一对继承于UINavigationController 的文件

.m 中这么写

#import "BaseNVC.h"

@interface BaseNVC ()<UIGestureRecognizerDelegate>

@property(nullable, nonatomic, readonly) UIGestureRecognizer *interactivePopGesture;

@end

@implementation BaseNVC

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    self.interactivePopGesture.enabled = NO;
    
  //  self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
    
}


// 统一设置 bar 的字体大小和颜色
+(void)initialize{
    
        UINavigationBar *navTheme = [UINavigationBar appearance];
        [navTheme setTitleTextAttributes:@{NSFontAttributeName:FONT_RATIO(17.f), NSForegroundColorAttributeName:[UIColor whiteColor]}];
        [navTheme setBarTintColor:NAVIGATION_COLOR];
        [navTheme setTintColor:NAVIGATION_COLOR];
    
}

- (void)viewWillAppear:(BOOL)animated{
    
    [super viewWillAppear:animated];
    
    __weak id weakSelf = self;
    self.interactivePopGestureRecognizer.delegate = weakSelf;
    
}


- (void)viewDidDisappear:(BOOL)animated{
    
    [super viewDidDisappear:animated];
    self.interactivePopGestureRecognizer.delegate = nil;
    
    
}


/**
 *  能拦截所有push进来的子控制器
 */
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
    
    if (self.viewControllers.count > 0) { // 如果现在push的不是栈底控制器(最先push进来的那个控制器)
        
        viewController.hidesBottomBarWhenPushed = YES;

    viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"Nav_back_ic"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(back)];
        
    }
    
    [super pushViewController:viewController animated:YES];
}


- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    BOOL isBack = YES; // 默认为支持右滑反回
    if ([self.topViewController isKindOfClass:[BaseNVC class]]) {
        if ([self.topViewController respondsToSelector:@selector(gestureRecognizerShouldBegin)]) {
            BaseNVC *vc = (BaseNVC *)self.topViewController;
            isBack = [vc gestureRecognizerShouldBegin:self.interactivePopGesture];
        }
    }
    
    return isBack;
}

- (void)back
{
    [self popViewControllerAnimated:YES];
}

- (UIStatusBarStyle)preferredStatusBarStyle{
    
    return UIStatusBarStyleLightContent;
}


- (void)gestureRecognizerShouldBegin{
    
     [self popViewControllerAnimated:YES];

}

#pragma mark ---- 加入这行代码 (防止手势返回再进入卡顿现象)---
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    
    return self.childViewControllers.count > 1;
    
}



- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

希望对你有帮助!!!

© 著作权归作者所有

GLAlanTong
粉丝 3
博文 21
码字总数 15640
作品 0
广州
程序员
私信 提问
xcode5 ios7 status bar 各种隐藏问题

各种关于ios7 下隐藏status bar的问题。汇集一下: 用xcode5开发新的iOS游戏,虽然我已经在info.plist里面把Status bar is initially hidden设置成了YES,但在设备上一跑还是看到status bar,...

常思过
2014/03/20
1K
0
iOS 11 安全区域适配总结

导语:本文主要是对iOS 11下APP中内容下移20pt或下移64pt的问题适配的一个总结。内容包括五个部分:问题的原因分析、属性的计算方式、什么情况下的会发生内容下移、有哪些解决方法、解决这个...

Daniel_s
2017/11/03
16
0
定制iOS 7中的导航栏和状态栏

由于种种原因,申请了一个开源中国的帐号,也许会由于我的不耐心,不会亲自去一步步的写博文,但准备把自己看到的好的,都转载过来,就当时资源的存储,也算是一种推广吧。 iOS 7 教程:定制...

谁家的阿毛
2013/11/21
1K
0
(解决办法) UISearchBar 可以呼唤出键盘但无法输入

近段时间开发ios应用,出现'UISearchBar 可以呼唤出键盘但无法输入 '问题,网上搜索后,其中只有一个贴“iOS 6 系统内 UISearchBar 可以呼唤出键盘但无法输入 ”跟我的问题类似,但是回复极少...

pgbo
2012/11/02
783
0
iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController

iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem是上篇,我们接着讲UINavigationController的重要作用,页面的管理和切换。 1、RootView 跳到SecondView 首先我们需要新一...

知行合一100
2012/06/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PCB设计-Allegro软件入门系列-铺铜操作(下)

铺铜是PCB很常见的操作,PCB的敷铜一般都是覆地铜,增大地线面积,有利于地线阻抗降低,使电源和信号传输稳定,在高频的信号线附近敷铜,可大大减少电磁辐射干扰,起屏蔽作用。 本讲讲解啊一...

demyar
17分钟前
2
0
如何通过WASI SDK 在Linux上编译ZXing C++

Mozilla在今年三月份的时候公布了WASI。WASI的目标就是让WebAssembly在任何地方都可以运行,而不仅仅像现在这样只能运行在Node.js和Web浏览器中。WASI目前依然处于初级阶段,这篇文章分享下如...

yushulx
19分钟前
2
0
.Net界面开发神器—DevExpress官方汉化包免费下载!还在等什么?

点击获取DevExpress v19.1.7新版试用下载 DevExpress Localization Service允许您创建一组自定义的附属程序集,要将语言包添加到程序集中,请查看本文中为大家列出的对应版本的汉化包,下载并...

FILA6666
19分钟前
2
0
php生成二维码

        header('Content-Type: image/png');        //清除缓冲区,防止之前面不知道的情况下被加头部信息导致不显示图片内容        ob_clean();        $...

横着走的螃蟹
24分钟前
2
0
伪类和伪元素

伪类和伪元素 伪类和伪元素,对于绝大多数同学来说,都是耳熟能详的名字,但确实又有很多人搞不清楚它们之间的区别,以致于混淆概念。而当概念都混淆的时候,也往往意味着你不会经常使用它,...

不负好时光
27分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部