在设置标题栏时常常遇到修改标题、修改返回按钮标题、增加一些按钮等需求,实现过程中一般会把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:/255.0 green:/255.0 blue:/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(, , , )];
[[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

UINavigationControlle 之 UINavigationBar及navigationItem关系探讨的更多相关文章

  1. iOS UINavgationController、 UINavigationBar、 UINavigationItem关系分析

    一般导航控制器含有4个对象,UINavigationController.UINavigationBar.UIViewController.UINavigationItem. 1:UINavigati ...

  2. 如何修改 UINavigationController、UINavigationBar 中 navigationItem 左侧 “返回” 按钮的名称

    如果我们从 title 为 “首页” 的页面 A 点击进入一个子页面 B,那么在页面 B 的左上角将显示一个名为 “<首页” 的按钮.假设这个页面 A 叫 “你是我天边最美的云彩”,那在页面 B ...

  3. UITabBar,UINavigationBar的布局和隐藏问题

    ---恢复内容开始--- 1. 前言 UITabBar,UINavigationBar非常的好用,但是毕竟是系统自带的,不受自己完全掌握,对于布局和隐藏会有一些问题,现在就来谈谈我的想法和一些问题. ...

  4. 异常 try catch finally return 执行关系 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. UINavigationController 导航控制器

    一.导航视图控制器 1.管理视图控制器 2.控制视图控制器之间的跳转 3.是以压栈和出栈的形式来管理视图控制器 4.导航视图控制器必须要设置根视图控制器 5.导航是视图控制器包含UINavigatio ...

  6. jvm高级特性(5)(1)(原子性,可见性,有序性,volatile,概述)

    JVM高级特性与实践(十二):高效并发时的内外存交互.三大特征(原子.可见.有序性) 与 volatile型变量特殊规则 简介: 阿姆达尔定律(Amdahl):该定律通过系统中并行化与串行化的比重来描 ...

  7. oc界面开发整理

    oc界面开发整理 ViewController.h from test82 #import <UIKit/UIKit.h> @interface ViewController : UIVi ...

  8. UINavigationItem UINavigationBar 关系分析

    目录 1.关系分析 2.关系综述 3.概念点 4.疑问 1.关系分析 UIBarItem-> UIBarButtonItem -> UINavigationItem 1.1 UIBarIt ...

  9. UINavigationItem UINavigationBar 关系分析[转]

    http://blog.csdn.net/luoyeffcs/article/details/16106707 目录 1.关系分析 2.关系综述 3.概念点 4.疑问 1.关系分析 UIBarItem ...

随机推荐

  1. 13、Actor

    1.介绍 Scala的Actor类似于Java中的多线程编程.但是不同的是,Scala的Actor提供的模型与多线程有所不同. Scala的Actor尽可能地避免锁和共享状态,从而避免多线程并发时出现 ...

  2. Netbeans使用UTF-8编码

    如果要NetBeans用UTF-8对文件进行解码,需要修改配置文件,具体方法如下: 1. 找到你的Netbeans安装目录下的etc文件夹,如C:\Program Files\NetBeans 6.9 ...

  3. 【leetcode 5. 最长回文子串】解题报告

    方法一:中心扩展算法 解题思路:从左到右每一个字符都作为中心轴,然后逐渐往两边扩展,只要发现有不相等的字符,则确定了以该字符为轴的最长回文串,但需要考虑长度为奇数和偶数的不同情况的处理(长度为偶数时轴 ...

  4. 【leetcode 106. 从中序与后序遍历序列构造二叉树】解题报告

    前往 中序,后序遍历构造二叉树, 中序,前序遍历构造二叉树 TreeNode* build(vector<int>& inorder, int l1, int r1, vector ...

  5. iOS模拟器的应用沙盒在MAC中的位置

    每个iOS应用都有自己专属的应用沙盒.分别为 应用程序包 Documents/ Library/Caches/ Library/Preferences/ tmp/ 当运行模拟时,在MAC下找到对应路径 ...

  6. ASP.NET控件之RequiredFieldValidator控件

    作用:对textbox或者其他输入框进行非空验证: 属性:ControlToValidate (选择要指向的控件) ErrorMessage(错误,输入要显示的错误信息) 应用方法: 原型: Demo ...

  7. 浮点数与快速log2

    请先于浮点数的文章:http://blog.jobbole.com/86371/ 先贴一张关于float和double的图: float: double: 快速log2长这样: int flog2(f ...

  8. 清除input框对浏览器保存的用户名和密码自动填充问题

    清除input框对浏览器保存的用户名和密码自动填充问题: type类型写如下写法,聚焦的时候type类型为“password” <input ng-model="getpwd" ...

  9. PureComponent

    前言 React15.3中新加了一个 PureComponent 类,PureComponent 也就是纯组件,取代其前身 PureRenderMixin , PureComponent 是优化 Re ...

  10. web综合案例04

    web综合案例02 web综合案例02 web综合案例04 待补充 ... ...