前言

今天遇到一个设置 UINavigationBar 返回的问题,发现对UINavigationBar的使用还是有很多问题,所以今天整理了一下。(以下只是个人理解)

官方解释传送门

1.关于UINavigationBar 设置 translucent 属性

当我们在实现以下代码的时候,

translucent 默认属性为TRUE , 以下为界面 TRUE 和 FALSE 不同的效果。

通过效果我们可以看到translucent 是设置 UINavigationBar 透明显示的,但是其对UIViewController有很大的影响。影响UIViewController 在手机显示的整体区域,但是这里要注意的是 UIViewController 的frame 高度是不会变的(我在UIViewController 添加的按钮的 Y 值为 height - 100),所以这里大家使用的时候一定要注意。

2.如何隐藏UINavigationBar 返回字体

+(void)load{//runtime 函数替换[[self class] zxlSwizzleMethod:@selector(viewDidLoad) swizzledSelector:@selector(replace_viewDidLoad)];
}- (void)replace_viewDidLoad{[self replace_viewDidLoad];self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleDone target:nil action:nil];//隐藏返回按钮跟随的字体
}


其他的设置多多少少会有一些坑,大家就不要走弯路了。

3.如何设置UINavigationBar 返回按钮图片

  [UINavigationBar appearance].backIndicatorImage = [[UIImage imageNamed:@"Titlebackbg.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];[UINavigationBar appearance].backIndicatorTransitionMaskImage = [[UIImage imageNamed:@"Titlebackbg.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

4.获取UINavigationBar 返回按钮的点击事件

头文件实现协议

@protocol ZXLBackButtonHandlerProtocol <NSObject>
@optional
// Override this method in UIViewController derived class to handle 'Back' button click
-(BOOL)navigationShouldPopOnBackButton;
@end@interface UIViewController (Extension)<ZXLBackButtonHandlerProtocol>@end

.m文件实现如下:

@implementation UINavigationController (JLBExtension)- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {if([self.viewControllers count] < [navigationBar.items count]) {return YES;}BOOL shouldPop = YES;UIViewController* vc = [self topViewController];if([vc respondsToSelector:@selector(navigationShouldPopOnBackButton)]) {shouldPop = [vc navigationShouldPopOnBackButton];}if(shouldPop) {dispatch_async(dispatch_get_main_queue(), ^{[self popViewControllerAnimated:YES];});} else {for(UIView *subview in [navigationBar subviews]) {if(0. < subview.alpha && subview.alpha < 1.) {[UIView animateWithDuration:.25 animations:^{subview.alpha = 1.;}];}}}return NO;
}
@end

代码出处 //https://github.com/onegray/UIViewController-BackButtonHandler

5.设置 UINavigationBar 透明

在App的实际应用场景中设置顶部透明然后,返回或者下一界面的时候又不透明,最好的使用方式是在一开始的时候设置navigationController的UINavigationBar为透明。 然后创建一个App中统一使用的基类ViewController,其他的界面继承ViewController。设置统一的顶部颜色为白色,然后设置你想要的场景界面为透明。 这样在使用手势返回的时候就是这样的效果,没有闪动的效果了。但是这样势必会带来一个问题就是App中所有的界面计算Y起始位置的时候要从 [[UIApplication sharedApplication] statusBarFrame].size.height 加上navigationBar的高度开始布局。 界面展示区域也就是 ViewController高度减去 ([[UIApplication sharedApplication] statusBarFrame].size.height + self.navigationController.navigationBar.frame.size.height)。 不过个人觉得这种方式是还是值得推荐的,因为这样你就可以在当前界面的快速实现不同样式的title而不影响其他界面的样式。但是弊端是顶部区域由于有navigationBar,所以此区域是不能点击的。如果一定要使用顶部navigationBar再做其他处理。

6.关于电池栏类型设置 preferredStatusBarStyle 返回

在应用场景中经常会出现,顶部电池栏颜色更换的需求。首页在要变颜色的
ViewController 中实现以下代码

-(UIStatusBarStyle)preferredStatusBarStyle{return UIStatusBarStyleLightContent;
}

然后实现UINavigationController 的扩展类如下(一定要做,不然没有效果)

@implementation UINavigationController (Extension)- (UIViewController *)childViewControllerForStatusBarStyle{return self.visibleViewController;
}
@end

UINavigationController不会将 preferredStatusBarStyle方法调用转给它的子视图,而是由它自己管理状态,而且它也应该那样做。因为UINavigationController 包含了它自己的状态栏
,因此就算 UINavigationController中的viewController 实现了 preferredStatusBarStyle方法也不会调用,所以一定要实现UINavigationController 扩展。(很重要)

7.返回按钮不同样式变换

UINavigationBar 上面的返回按钮替换图片是很麻烦的,而且不管怎么设置都没有很好的效果。所以我们这里直接考虑添加 leftBarButtonItem 来替换当前界面的返回按钮。
但是当我们替换后就会发现,leftBarButtonItem 和 UINavigationBar上的返回按钮位子和点击区域是不同的,leftBarButtonItem 是往右偏移一点的。(leftBarButtonItem 往右偏移怎么处理?)代码中借鉴(https://github.com/spicyShrimp/iOS-11-UINavigationItem-SXFixSpace ) 处理偏移问题,不过修改了更换图片的偏移位子。

前一个界面

下一个界面 (要更换的界面)

滑动时渐变效果

以上处理完美解决返回按钮样式更换问题。

文中使用的Dome 地址如下
代码传送门

IOS 关于UINavigationBar的使用相关推荐

  1. ios系统升级记录适配篇

    以下记录的是,我在学习中的一些学习笔记,这篇笔记是自己学习的学习大杂烩,主要用于记录,方便查找 系统系列 系统发布时间 ios系统版本 ios 15系列 ios 15.2 ios 15.1 2021年 ...

  2. 【Android】ActionBar的使用(1)

    前(fei)言(hua):转行iOS开发半年,很久没接触Android了,前几天去上课,听着实在无聊,随手拿了同学的一本<Android UI设计>,发现有好多基础知识自己虽然用过,但是都 ...

  3. iOS阶段学习第31天笔记(UINavigationBar介绍)

    iOS学习(UI)知识点整理 一.UINavigationBar 的介绍 1)概念:UINavigationBar 是用于定义导航栏按钮的一个类对象 2)在使用UINavigationBar之前必须先 ...

  4. iOS 开发中如何隐藏UINavigationBar

    有的时候,我们的视图使用了Navigation Controller ,但是主界面(rootviewcontroller)或其它push进入的界面 想使用一个全屏的view,就是说,不显示顶部的nav ...

  5. iOS 设置系统UINavigationBar返回按键不显示上一界面的标题。

    一.创建分类  使用交换方法地址(苹果黑魔法)  实现自定义的myInit方法和系统自带的init方法交换.     将下面的.m 和.h 文件放入工程中,并在PrefixHeader中引用此分类即可 ...

  6. 如何设计一个 iOS 控件?(iOS 控件完全解析)

    前言 一个控件从外在特征来说,主要是封装这几点: 交互方式 显示样式 数据使用 对外在特征的封装,能让我们在多种环境下达到 PM 对产品的要求,并且提到代码复用率,使维护工作保持在一个相对较小的范围内 ...

  7. [iOS]调和 pop 手势导致 AVPlayer 播放卡顿

    作者 NewPan 关注 2017.07.15 14:24* 字数 3110 阅读 749评论 8喜欢 17 声明:我为这个框架写了四篇文章: 第一篇:[iOS]UINavigationControl ...

  8. iOS 10 个实用小技巧(总有你不知道的和你会用到的)

    在开发过程中我们总会遇到各种各样的小问题,有些小问题并不是十分容易解决.在此我就总结一下,我在开发中遇到的各种小问题,以及我的解决方法.比较普遍的我就不再提了,这里主要讲一些你可能不知道的(当然,也有 ...

  9. iOS开发系列--通知与消息机制

    http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣 ...

最新文章

  1. Java内存模型与线程
  2. Windows phone 7更新已经支持复制/粘贴[有图有真相]
  3. 小冰和她的兄弟姐妹们组团出道:唱歌跳舞写文章样样都会,而且都开放版权...
  4. 陶哲轩实分析 习题 10.3.5
  5. hibenate5.1配置mysql_hibernate5.2的基本配置方法(详解)
  6. 实现android应用程序自动化测试的批处理脚本,批处理脚本实现android应用程序自动化测试...
  7. elasticsearch java对象 驼峰原则_Elasticsearch简介与实战
  8. 大话细说ORM -----(转)
  9. python一百行代码多少钱_用86行Python代码模拟太阳系
  10. 使用crypt生成用户密码-Tested on RedHat SuSE Platform
  11. LNK快捷方式漏洞利用方式 exp制作教程
  12. java 接口可以被继承_接口能被继承吗?
  13. URAL 1022 Genealogical Tree
  14. linux网桥动态ip,使用Linux主机当网桥
  15. MySQL中对索引的理解 特点 优势_深入理解MySQL索引和优化
  16. redirect_uri参数错误
  17. JAVA音程_桌面应用|与 Linux 一起学习:学习音乐
  18. html5网页设计 薛之谦个人网页适用个人博客网页模板
  19. 数据提取-数据提取软件
  20. 计算机设备调试及维护,计算机安装、调试及维护工职业标准-简.doc

热门文章

  1. 参与到大浪潮中,做最核心的那一环
  2. ubuntu 图标有锁
  3. CMake是什么?具体有什么作用?
  4. (附源码)mysql+ssm芜湖公共书房服务平台 毕业设计 250859
  5. 【vivado UG学习】Implementation策略学习
  6. idea报 @Override is not allowed when implementing interface method解决方法
  7. 许式伟:相比 Python,我们可能更需要 Go+
  8. 12.01-内存管理_定时器的循环引用
  9. ECCV 2020 ——RobustScanner: Dynamically Enhancing Positional Clues for Robust Text Recognition
  10. 组织行为学-年轻团队太难带?“游戏化管理”疗效好、见效快