在使用UINavigtionController的时候,常常会弄不清哪些属性是UINavigationController的,哪些属性是UIViewController的。并且在更改导航栏和工具栏的样式的时候,常常会于遇到api使用下去没有效果的情况。总之,一直用得比較混乱,今天要好好做一个总结,把那些常常使用的功能都搞清楚。

一、怎样往导航栏和工具栏加入button

1、navigationItem属性

这个属性是UIViewController在UINavigationControllerItem类目下的。

@property(nonatomic,readonly,retain)UINavigationItem *navigationItem;

文档的解释:在必要的时候会创建该属性对象。以便于控制器能够定制它自己的导航栏外观。

UINavigationItem有下面属性:

@property(nonatomic,retain)UIBarButtonItem *leftBarButtonItem;//导航栏左边的button,位置与“返回”button同样

@property(nonatomic,retain)UIBarButtonItem *rightBarButtonItem;//导航栏右边的button

@property(nonatomic,retain)UIBarButtonItem *backBarButtonItem; //假设前面的那个控制器有title内容,则back button的内容为<title,假设没有title。默认显示<back

@property(nonatomic,retain)UIView *titleView;//自己定义title的样式

@property(nonatomic,copy)NSArray *leftBarButtonItems NS_AVAILABLE_IOS(5_0);//使用该属性,能在导航栏左边显示多个button

@property(nonatomic,copy)NSArray *rightBarButtonItems NS_AVAILABLE_IOS(5_0);//类似leftBarButtonItems属性

@property(nonatomic,copy)NSString *title;//给它赋值的效果相当于给控制器的title属性赋值一样

@property(nonatomic,copy)NSString *prompt; //文字内容会显示在title的上面。这个属性会使得导航栏的高度添加30

@property(nonatomic) BOOL leftItemsSupplementBackButton NS_AVAILABLE_IOS(5_0);//默认值为NO。在leftbutton和backbutton同一时候存在的情况下,仅仅显示leftbutton;假设设为YES,将会显示backbutton和leftbutton,backbutton显示在leftbutton前面

@property(nonatomic,assign)BOOL hidesBackButton;

2、toolbarItems属性

这个属性是UIViewController在UINavigationControllerContextualToolbarItems类目下的。

@property (nonatomic,retain)NSArray
*toolbarItemsNS_AVAILABLE_IOS(3_0);

功能:在UIViewController中创建一系列UIBarButtonItem对象。将这些对象加入到toolbarItems数组中,这些UIBarButtonItembutton就会显示在控制器底部的工具栏中。

代码例如以下:

UIBarButtonItem *refreshItem = [[UIBarButtonItem alloc]initWithCustomView:refreshButton];
//每一个控制器有自己的toolbaritems属性,管理工具栏的数组
[self setToolbarItems:[NSArray arrayWithObjects:refreshItem, nil]];

二、怎样定制导航栏和工具栏的样式

1、导航栏的样式:

navigationBar是UINavigationController的属性

(1)导航栏左右两边的button
         从ios7開始,tintColor属性仅仅能设置导航栏上button的字体颜色。无法影响到导航栏的背景色。

(2)导航栏中间的title
        从ios5開始。titleTextAttributes属性能够设置title的字体、颜色、大小等。
     比如:
[self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor redColor],NSFontAttributeName:[UIFont boldSystemFontOfSize:20]}];

NSForegroundColorAttributeName是keyword。表示文字的颜色

NSFontAttributeName表示字体大小和样式。

//这里的两个keyword是ios7開始才有的,ios7之前有另外的相应keyword

(3)导航栏的背景
         颜色:从ios7開始。导航栏的背景色由barTintColor来设置,它会把状态栏也变成一样的颜色。
         背景图:从ios5開始。

- (void)setBackgroundImage:(UIImage
*)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics用于设置导航栏背景图片

(4)导航栏的显示与隐藏

仅仅有UINavigationController的navigationBarHidden属性才干控制导航栏的显示和隐藏。

2、工具栏的样式:

toolbar是UINavigationController的属性

(1)工具栏的button

与navigationbar一样的情况。从ios7開始。tintcolor属性设置button的字体颜色

(2)工具栏的背景色

bartintcolor设置工具栏的背景颜色

(3)工具栏的背景图片

- (void)setBackgroundImage:(UIImage *)backgroundImage forToolbarPosition:(UIBarPosition)topOrBottom barMetrics:(UIBarMetrics)barMetrics

(4)工具栏的显示和隐藏

仅仅有UINavigationController的toolbarHidden属性才干控制导航栏的显示和隐藏。

三、NavigationBar的显示困惑

1、leftbutton和backbutton

(1)假设当前控制器设置了leftbutton。优先显示leftbutton

(2)假设当前控制器没有设置leftbutton,且当前控制器不是导航控制器的根。则显示前面那个控制器的backbutton。假设前面那个控制器没有指定backbutton。则系统会依据前一层的控制器的title属性生成一个backbutton。假设前一层控制器的title为“pre”,则backbutton显示为“<pre”,否则显示为“<back”.

能够说。当前控制器的backbutton是为后面的那个控制器准备的。

(3)假设当前控制器没有leftbutton,且当前控制器是导航控制器的根。则导航栏左边没有不论什么显示。

2、控制器的title和navigationItem的title、titleView

(1)假设navigationItem的titleview属性有指定,优先显示titileview的样式

(2)假设titleview没有指定,优先显示navigationItem的title的文字

(3)假设navigationItem的title没有指定,就以控制器的title属性来显示。

四、导航控制器的栈

1、UINavigationController的viewControllers属性NSArray类型,存放当前在导航控制器栈内的全部视图控制器。

2、topViewController属性指的是导航控制器栈顶的视图控制器。

3、visibleViewController属性,假设栈顶的控制器还显示了一个模态视图控制器。则指向该模态视图控制器,否则就是栈顶的那个视图控制器。

UINavigationController(二)的更多相关文章

  1. iOS基础 - 控制器管理

    一.Container 一个iOS的app很少只由一个ViewController组成,除非这个app极其简单.当app中有多个ViewController的时候,我们就需要对这些ViewContro ...

  2. UINavigationController详解二(转)页面切换和SegmentedController

    原文出自:http://blog.csdn.net/totogo2010/article/details/7682433,非常感谢. 1.RootView 跳到SecondView 首先我们需要新一个 ...

  3. [转]iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController

    转载地址:http://blog.csdn.net/totogo2010/article/details/7682433 iOS学习之UINavigationController详解与使用(一)添加U ...

  4. iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController

    iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem是上篇,我们接着讲UINavigationController的重要作用,页面的管理和切换. ...

  5. UINavigationController具体解释(二)

    @UINavigationBar-----(是一个View)基本介绍 1.导航栏,和导航控制器一样,是一个容器用来显示提供的其它对象的内容 2.导航栏显示的内容,通过设置UINavigationIte ...

  6. UINavigationController + UIScrollView组合,视图尺寸的设置探秘(二)

    承接上文,我想把view布局修改为如下模式,让ScrollView长在NavigationBar的下方,这总不会有遮挡的问题了吧: story board内容如下,主要是右侧视图蓝色区域添加了Scro ...

  7. UINavigationController

    知识点: 1)UINavigationController 2)UINavigationBar 3)UINavigationItem 4)UIToolBar ===================== ...

  8. iOS项目开发中的知识点与问题收集整理②(Part 二)

    1.点击UIButton 无法产生触摸事件    如果在UIImageView中添加了一个按钮,你会发现在默认情况下这个按钮是无法被点击的,需要设置UIImageView的userInteractio ...

  9. IOS 学习 开发 自定义 UINavigationController 导航

    文件目录如下:基本导航顺序: root -> First -> Second -> Third.其中,FirstViewController作为 navigation堆栈的rootv ...

随机推荐

  1. 洛谷—— P1775 古代人的难题_NOI导刊2010提高(02)

    P1775 古代人的难题_NOI导刊2010提高(02) 题目描述 门打开了,里面果然是个很大的厅堂.但可惜厅堂内除了中央的一张羊皮纸和一支精致的石笔,周围几具骷髅外什么也没有.难道这就是王室的遗产? ...

  2. 【贪心】Gym - 100507H - Pair: normal and paranormal

    每次取相邻的两个可以射击的从序列中删除,重复n次. 可以看作括号序列的匹配. #include<cstdio> #include<vector> using namespace ...

  3. 【bitset】poj2443 Set Operation

    模板题.S[i][j]表示i是否存在于第j个集合里.妈蛋poj差点打成poi(波兰无关)是不是没救了. #include<cstdio> #include<bitset> us ...

  4. 【动态规划】【最长上升子序列】【贪心】bzoj1046 [HAOI2007]上升序列

    nlogn求出最长上升子序列长度. 对每次询问,贪心地回答.设输入为x.当前数a[i]可能成为答案序列中的第k个,则若 f[i]>=x-k && a[i]>ans[k-1] ...

  5. [CF413D]2048

    题目大意: 在一个长度为$n(n\le2000)$的数组中填数$2$或$4$,待所有数字全部填好后,按照类似于2048的规则向左合并.给定某些格子上的数,问在当前情况下要使得合并后的最大数超过$2^k ...

  6. 打印不同的数 Exercise07_05

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:打印不同的数 * */ public class Exercise07_0 ...

  7. Swift开发经验——外部参数名

    一.什么是外部参数名? 浅显地说,外部参数名就是在调用一个方法时要在方法的参数前面加上一个特定的名字,目的是便于阅读代码,提高维护效率.   二.在最新的Xcode中,外部参数名的性质与用法如下 性质 ...

  8. spark DiskBlockManager

    RDD本身presist可以是本地存储,本地存储级别的持久化实现方式如下: DiskBlockManager负责管理和维护block和磁盘存储的映射关系,通过blockId作为文件名称,然后如果是多个 ...

  9. Windows 无法验证此设备所需的驱动程序的数字签名。某软件或硬件最近有所更改,可能安装了签名错误或损毁的文件,或者安装的文件可能是来路不明的恶意软件。(代码52)

    由未签名驱动导致的键鼠装无法使用的问题 usb 问题失效. 要是win 10的话  导致的结果就是 无线键鼠套装无法使用. 解决办法是 1.按下shift 按键 点击重启按钮 重启后 2.疑难解答-- ...

  10. linux dd命令实例讲解

    转:http://blog.chinaunix.net/uid-28549627-id-3922282.html 提到linux 系统中的dd命令,各位技术博友大多都很熟悉,用法也是好多,今天主要跟大 ...