当前位置: 首页 > news >正文

UINavigationControlle 之 UINavigationBar及navigationItem关系探讨

在设置标题栏时常常遇到修改标题、修改返回按钮标题、增加一些按钮等需求,实现过程中一般会把UINavigationController、UINavigationBar、navigationItem及self.navigationController.navigationItem之间概念会混淆。

概念描述说明:

UINavigationController:是一个ViewController,导航栏控制器,其通过栈来直接控制了其下的viewController。

可通过此设置全局导航栏属性。如导航栏背景或title颜色等。子视图会继承这些属性,具体见下面“初始化UINavigationController”

UINavigationBar:是一个View,NavigaitonBar就是导航栏,位于屏幕的上方,管理整个NavigationController的navigationItem,即类似navigationController一样提供了一个栈来管理item。

UINavigationItem:是一个NSObject,一般使用在self.navigationItem, 包含了当前页面导航栏上需要显示的全部信息(
title,prompt,titleView,leftBarButtonItem,rightBarButtonItem,backBarButonItem )。其中UIBarButtonItem是一个UIBarItem,是一种专门放在UINavigationBar上的特殊button。

初始化UINavigationController

ViewController *vc = [[ViewController alloc]init];
UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:vc];
//此处可设置背景颜色及文字颜色
方法一:
[navi.navigationBar setBarTintColor:[UIColor colorWithRed:20/255.0 green:155/255.0 blue:213/255.0 alpha:1.0]];
[navi.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor],NSForegroundColorAttributeName,nil]];
方法二:
//设置NavigationBar背景颜色
[[UINavigationBar appearance] setBarTintColor:[UIColor redColor]];
[[UINavigationBar appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
self.window.rootViewController = navi;
[self.window makeKeyAndVisible];

 

UINavigationBar与UINavigationItem


navigationController直接控制viewControllers,然后包含的navigationBar形成整个navigationController的导航栏。

navigationBar包含整个navigationItem的栈,管理整个navigationController的navigationItem( NSArray *items 属性)。
navigationItem包含了bar视图的全部元素(如title,tileview,backBarButtonItem等),受当前viewcontroller管理,即bar形成整个nv的导航视图,然后每个nv页面的导航栏元素由所在页面的navigationItem管理。即设置当前页面的左右barbutton,用 self.navigationItem.leftBarButtonItem等。

self.navigationController.navigationItem 与 self.navigationItem
因为navigationController继承于UIViewController,因此它有navigationItem属性。设置当前界面导航栏元素时用的是navigationItem。此处应当忽略self.navigationController的navigationItem属性。

NavigationItem存放在UINavigationBar上。由下图我们可以知道一个导航控制器控制着多个视图,一个视图控制器控制一个UINavigationItem。

 

总结说明:

1、navigationController 管理多个viewController,是以栈的形式存放。

2、navigationBar 包含在 navigationController 中,且仅有一个,管理整个navigationController的navigationItem。

3、navigationItem包含了bar视图的全部元素。由当前的viewController管理。

4、navigationBar形成整个nv的导航视图,然后每个nv页面的导航栏元素由所在页面的navigationItem管理。

    即设置当前页面的左右barbutton,用 self.navigationItem.leftBarButtonItem等。

方法一:修改返回按钮titile

UIBarButtonItem *returnButtonItem = [[UIBarButtonItem alloc] init];
returnButtonItem.title = @"";
self.navigationItem.backBarButtonItem = returnButtonItem;

方法二:自定义UIBarButtonItem

self.navigationItem.leftBarButtonItem = leftItem;

方法三:自定义返回按钮

UIImage *backButtonImage = [[UIImage imageNamed:@"image1"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 30, 0, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
//将返回按钮的文字position设置不在屏幕上显示
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];

设置标题

self.title = @”…”;

右侧增加按钮

UIBarButtonItem *removeButton=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(remove)];
[self.navigationItem setRightBarButtonItem:removeButton];

 

参考文献:https://blog.csdn.net/happysdh/article/details/50968235

 

转载于:https://www.cnblogs.com/xujinzhong/p/8809307.html

相关文章:

  • sublime text2快捷键的使用
  • windows创建进程的3种方式下各API调用层次
  • 看看别人家的孩子
  • nginx和dubbo微服务架构图
  • 北京西客站火车行李托运指南
  • DNS原理和正、反向解析配置
  • android Vibrator 使用
  • Reddit CEO亲自诠释内容审核的无奈
  • 本地磁盘上有SVN的感叹号的解决办法
  • 第一篇博客
  • 无法加载 DLL“oramts.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。 —— 的解决方法...
  • JDK9: 集成 Jshell 和 Maven 项目.
  • PE文件结构深入详解
  • 【HTTP】Speed and Mobility: An Approach for HTTP 2.0 to Make Mobile Apps and the Web Faster
  • 蛰伏多年的 HTML5 创业者,终于被送上了风口
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • Hibernate【inverse和cascade属性】知识要点
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Java到底能干嘛?
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • SQLServer之创建显式事务
  • 阿里云前端周刊 - 第 26 期
  • 第2章 网络文档
  • 看域名解析域名安全对SEO的影响
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 容器服务kubernetes弹性伸缩高级用法
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 项目实战-Api的解决方案
  • "无招胜有招"nbsp;史上最全的互…
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .chm格式文件如何阅读
  • .NET 读取 JSON格式的数据
  • .net 流——流的类型体系简单介绍
  • .NET大文件上传知识整理
  • .NET面试题(二)
  • .NET企业级应用架构设计系列之应用服务器
  • .ui文件相关
  • /run/containerd/containerd.sock connect: connection refused
  • [ 蓝桥杯Web真题 ]-布局切换
  • [20181219]script使用小技巧.txt
  • [AIGC] Redis基础命令集详细介绍
  • [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算
  • [Flutter]WindowsPlatform上运行遇到的问题总结
  • [Hive] CTE 通用表达式 WITH关键字
  • [hive] 窗口函数 ROW_NUMBER()