self.navigationController.navigationItem 与 self.navigationItem 关系对比与分析

原创 2015年11月19日 18:56:19

http://blog.csdn.net/luoyeffcs/article/details/16106707

以下两者对比

    self.navigationController.navigationItem = customItem;

    self.navigationItem = customItem;

我们都知道navigationItem是UIViewController的一个属性,这个属性是为 UINavigationController服务的。文档中是这么解释的“The navigation item used to represent the view controller in a parent’s navigation bar. (read-only)”,即navigation item在navigation Bar代表一个viewController,具体一点儿来说就是每一个加到navigationController的viewController都会有一个对应的navigationItem,该对象由viewController以懒加载的方式创建,稍后我们可以在对象中堆 navigationItem进行配置,可以设置leftBarButtonItem, rightBarButtonItem, backBarButtonItem, title以及prompt等属性。前三个每一个都是一个UIBarButtonItem对象,最后两个属性是一个NSString类型描述,注意添加该描述以后NavigationBar的高度会增加30,总的高度会变成74(不管当前方向是Portrait还是Landscape,此模式下 navgationbar都使用高度44加上prompt30的方式进行显示)。当然如果觉得只是设置文字的title不够爽,你还可以通过 titleview属性指定一个定制的titleview,这样你就可以随心所欲了,当然注意指定的titleview的frame大小,不要显示出界。

1.关系分析

2.关系综述

3.概念点

4.疑问


1.关系分析

UIBarItem-> UIBarButtonItem -> UINavigationItem

1.1 UIBarItem:

UIBarItem类是一个可以放置在Bar之上的所有小控件类的抽象类。继承了该基类所有子类在外观上类似于一个Button,它们都有一个标题,图片,动作以及目标,这点可以从其子类的初始化方法处看到。


1.2 UIBarButtonItem:

专门用来放在UIToolbar 或者 UINavigationBar的特殊button.基本行为跟button是一样的。另外从IOS5开始的Customizing Appearance 增加了一系列的方法调整显示。


1.3 UINavigationItem: NSObject  

(包含了当前页面导航栏上需要显示的全部信息)

title,prompt,titleView,leftBarButtonItem,rightBarButtonItem,backBarButonItem


1.4 UINavigationBar :UIView

NavigaitonBar就是导航栏,位于屏幕的上方,管理整个NavigationControllernavigationItem,即类似navigationcontroller一样提供了一个栈来管理item


1.5 UINavigtionController :UIViewController

包含:viewcontrollersnavigationbartoolbar


1.6 navigationbarUIView

包含:items(UINavigationItem)


1.7 viewController

包含navigationitemtoolItem.  这两个属性控制了当前页面当前页面的navigationbartoolbar的外观。


2.关系综述

navigationcontroller直接控制viewcontrollers,然后包含的navigationbar形成整个nv的导航栏,bar并包含整个navigationItem的栈,管理整个nvnavigationitem NSArray *items 属性)。

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


3.概念点

3.1 

UINavigationController 是一个viewController

UINavigationBar 是一个view

UINavigationItem 是一个NSObject

UIBarButtonItem 是一个 UIBarItem,是一种专门放在bar上的特殊button

UIBarItem是一个NSObject,是是各种itme的父类


3.2 title

self.navigationItem.title,self.tabBarItem.title,self.title关系:

由于view controller本身包含navigationItemtabBarItem,所以可以单独对其title赋值,self.title会重写另外两个的值,只是提供的一种便利方法。


3.3 self.navigationItem,self.navigationController.navigationItem

self.navigationItem  是定制当前view 导航栏。根据当前的资料看,self.navigationController.navigationItem 是应该被忽视的属性,navigationcontroller继承与view controller,所以会有这个属性,但没有任何作用。

不过有人说,“They are Different. If you dynamically add UINavigationController, then you use self.navigationController.navigationItem.”但是没有得到验证,这点我也不认可。


3.4 navigationbar 高度 可更改

UINavigationBar *bar = [self.navigationController navigationBar];

    CGFloat navBarHeight = 70.0f;

    CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);

    [bar setFrame:frame];


3.5 navigationbar prompt

prompt 是一个NSString类型描述,注意添加该描述以后NavigationBar的高度会增加30,总的高度会变成74(不管当前方向是Portrait还是Landscape,此模式下navgationbar都使用高度44加上prompt30的方式进行显示)

如:

self.navigationItem.prompt=@"这是什么?";

self.title=@"HAH";



3.6 navigation barinteractivePopGestureRecognizer

navigation bar 可以修改barstyle transulucent,不能直接修改 frame,bounds,alpha等属性。可以通过initWithNavigationBarClass方法指定自己的navigationbar

IOS7 多了interactivePopGestureRecognizer,看资料说 ios7 UINavigationController 自动就加入了手势返回 前提是不能自定义leftBarButtonItem,自定义了leftBarButtonItem手势就失效了,待研究。


4.疑问

4.1控件都继承于uiview,都有tintcolorbackgroundcolor属性,那两者主要有什么区别呢?

4.2UIBarPosition UIBarMetrics 区别?


关于NavigationItem.rightBarButtonItem设置

第一种: UIImage *searchimage=[UIImage imageNamed:@"search.png"];     UIBarButtonItem *barbtn=[[UIBa...
  • zhuzhihai1988
  • zhuzhihai1988
  • 2012年06月29日 11:50
  • 49095

self.navigationItem和self.navigationController.navigationItem的区别?

self.navigationItem和self.navigationController.navigationItem的区别? **********************************...
  • dingwenchao456
  • dingwenchao456
  • 2016年03月16日 10:06
  • 1052

self.title 与 self.navigationItem.title 的区别

self.title是控制器默认view的title; self.navigationItem.title是显示在navgationbar中间的title。 1)若在Navigatio...
  • sophia_xiaoma
  • sophia_xiaoma
  • 2015年11月23日 17:52
  • 498

iOS Nav+TabBar下的self.title,self.navigationItem.title,self.tabBarItem.title区别和联系

今天项目中遇到个相当愚蠢的问题,以前没注意到,今天总结下: 大致意思和上面一样,导航栏title和tabBarItem的title不一致。 我的做法是先设置self.tabBarItem....
  • huifeidexin_1
  • huifeidexin_1
  • 2012年10月16日 17:47
  • 13620

对NavigationController/Bar/Item、self.navigationItem/self.navigationController.navigationItem区别的理解

(刚学计算机的新手请先百度,学习什么是“栈”。本人简单形容:栈就相当于放在一个地上可以装书本的盒子,放进去的顺序为书本1、2、3,拿出来的顺序则为3、2、1) 每个ViewController只有...
  • moon_prince2013
  • moon_prince2013
  • 2015年10月12日 14:16
  • 1155

IOS self.navigationItem.leftBarButtonItem 添加图片

self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"l...
  • niejinhao052011
  • niejinhao052011
  • 2014年08月27日 16:22
  • 1914

UINavigationController、UINavigationBar及navigationItem关系探讨

在设置标题栏时常常遇到修改标题、修改返回按钮标题、增加一些按钮等需求,实现过程中一般会把UINavigationController、UINavigationBar、navigationItem及se...
  • happysdh
  • happysdh
  • 2016年03月24日 07:25
  • 3604

self.navigationController.view 和 self.view的区别

今天在做 MBProgressHUD 的时候发现了一个问题  _HUD = [[MBProgressHUD alloc] initWithView:self.navigationCont...
  • u011140147
  • u011140147
  • 2014年05月12日 08:36
  • 2629

正确的加载xib文件的View或者ViewController

可能很多人都非常熟悉了,在故事版中加载一个ViewController。  ViewC *viewController = [self.storyboard instantiateViewCon...
  • u012986410
  • u012986410
  • 2015年08月16日 15:53
  • 14873

item属性总结

一.UINavigationItem1> 获得方式 * self.navigationItem // self是指控制器2> 作用 * 可以用来设置当前控制器顶部导航栏的内容:// 设置导航栏中...
  • cr7aaa
  • cr7aaa
  • 2015年03月06日 22:29
  • 200
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:self.navigationController.navigationItem 与 self.navigationItem 关系对比与分析
举报原因:
原因补充:

(最多只允许输入30个字)