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 区别?


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

recovery.img与boot.img对比分析

今天对比分析了一下recovery.img和boot.img的结构,从中粗略知道了Android手机中的恢复模式是怎么回事。 以下是文件结构的对比图: 从中我们知道: (1)...

ReentrantReadWriteLock与ReentrantLock对比分析

一.前言ReentrantReadWriteLock与ReentrantLockde的关系并不是雷峰塔与雷锋的关系。 个人理解: synchronized ——> ReentrantLock ——...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Heartbeat 与Corosync对比分析

引言: 在高可用系统中,系统服务可用性的监控是必不可少的一项基础组件。而目前流行的是Heartbeat和corosync,对于这两者各有什么优缺点呢?

Spark与Flink:对比与分析

Spark是一种快速、通用的计算集群系统,Spark提出的最主要抽象概念是弹性分布式数据集(RDD),它是一个元素集合,划分到集群的各个节点上,可以被并行操作。用户也可以让Spark保留一个RDD在内...

Spark与Flink:对比与分析

摘要:Spark是一种快速、通用的计算集群系统,Spark提出的最主要抽象概念是弹性分布式数据集(RDD),它是一个元素集合,划分到集群的各个节点上,可以被并行操作。而Flink是可扩展的批处理和流式...

qvod与gvod原理分析与对比

gvod与qvod在线P2P点播原理分析(转载)抽时间分析了一下,以下内容是个人观点,有不正确之处请指出因为我打算开发基于UT模式的PNP下载/点播软件,因此,首先有必要搞清楚目前这个领域里占有率比较...

fragment的生命周期,它与Activity生命周期的关联;

一、概论 随着Android系统的多样化,不仅仅在手机上,在平板、电视等设备上应用的也越来越多,这样就会有一个需要适应不同屏幕的问题。在Android3.0之后,谷歌推出了Fragment,Fr...

类与类的关系

类与类的关系

HTML与XML关系分析

XML与HTML的关系浅析

hive与关系型数据库对比

关系数据库里,表的加载模式是在数据加载时候强制确定的(表的加载模式是指数据库存储数据的文件格式),如果加载数据时候发现加载的数据不符合模式,关系数据库则会拒绝加载数据,这个就叫“写时模式”,写时模式会...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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