前面的一篇文章《iOS开发16:使用Navigation Controller切换视图》中的小例子在运行时,屏幕上方出现的工具栏就是Navigation Bar,而所谓UINavigationItem就可以理解为Navigation Bar中的内容,通过编辑UINavigationItem,我们可以使得在Navigation Bar中显示想要的东西,比如设置标题、添加按钮等。

这篇博客将会以一个小例子来演示如何设置UINavigationItem。

现在我用的是Xcode 4.3,在使用上跟Xcode 4.2差不多。

1、首先运行Xcode 4.3,创建一个Single View Application,名称为UINavigationItem Test:

2、其次,我们要使得程序运行时能够显示Navigation Bar:

2.1 单击AppDelegate.h,向其中添加属性:

@property (strong, nonatomic) UINavigationController *navController;

2.2 打开AppDelegate.m,在@synthesize viewController = _viewController;之后添加代码:

@synthesize navController;

#pragma mark -
#pragma mark Application lifecycle

2.3 修改didFinishLaunchingWithOptions方法代码如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; self.navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
[self.window addSubview:navController.view]; [self.window makeKeyAndVisible];
return YES;
}

此时运行程序,会发现出现了Navigation Bar:

下面讲一下关于NavigationItem的简单设置。

3、设置标题:

打开ViewController.m,在viewDidLoad方法中[super viewDidLoad];之后添加代码:

self.navigationItem.title = @"标题";

运行:

4、自定义标题,设置titleView:

如果我们想改变标题的颜色和字体,就需要自己定义一个UILabel,并且已经设置好这个Label的内容,可以设置自己想要的字体、大小和颜色等。然后执行self.navigationItem.titleView = myLabel;就可以看到想要的效果。

4.1 打开ViewController.h,向其中添加属性:

@property (strong, nonatomic) UILabel *titleLabel;

4.2 打开ViewController.m,在@implementation ViewController下面一行添加代码:

@synthesize titleLabel;

4.3 在viewDidLoad方法中,去掉self.navigationItem.title = @"标题";,并添加代码:

//自定义标题
titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0 , 100, 44)];
titleLabel.backgroundColor = [UIColor clearColor]; //设置Label背景透明
titleLabel.font = [UIFont boldSystemFontOfSize:20]; //设置文本字体与大小
titleLabel.textColor = [UIColor colorWithRed:(0.0/255.0) green:(255.0 / 255.0) blue:(0.0 / 255.0) alpha:1]; //设置文本颜色
titleLabel.textAlignment = UITextAlignmentCenter;
titleLabel.text = @"自定义标题"; //设置标题
self.navigationItem.titleView = self.titleLabel;

运行:

实际上,不仅仅可以将titleView设置成Label,只要是UIView的对象都可以设为titleView,例如,将4.3中的代码改成:

UIButton *button = [UIButtonbuttonWithType: UIButtonTypeRoundedRect];
[button setTitle: @"按钮" forState: UIControlStateNormal];
[button sizeToFit];
self.navigationItem.titleView = button;

则运行起来效果如下:

5、为Navigation Bar添加左按钮

以下是进行leftBarButtonItem设置的代码:

self.navigationItem.leftBarButtonItem = (UIBarButtonItem *)
self.navigationItem.leftBarButtonItems = (UIBarButtonItem *)
self.navigationItemsetLeftBarButtonItem:(UIBarButtonItem *)
self.navigationItemsetLeftBarButtonItem:(UIBarButtonItem *) animated:(BOOL)
self.navigationItemsetLeftBarButtonItems:(NSArray *)
self.navigationItemsetLeftBarButtonItems:(NSArray *) animated:(BOOL)

其实很简单,只要定义好一个UIBarButtonItem,然后执行上述某行代码就行了。

5.1 为了使得运行时不出错,我们在ViewController.m中添加一个空方法,由将要创建的左右按钮使用:

//空方法
-(void)myAction { }

5.2 添加一个左按钮:

在ViewDidLoad方法最后添加代码:

//添加左按钮
UIBarButtonItem *leftButton = [[UIBarButtonItem alloc]
initWithTitle:@"左按钮"
style:UIBarButtonItemStylePlain
target:self
action:@selector(myAction)];
[self.navigationItem setLeftBarButtonItem:leftButton];

运行效果如下:

创建一个UIBarButtonItem用的方法主要有:

[UIBarButtonItemalloc]initWithTitle:(NSString *) style:(UIBarButtonItemStyle) target:(id) action:(SEL)
[UIBarButtonItemalloc]initWithBarButtonSystemItem:(UIBarButtonSystemItem) target:(id) action:(SEL)

在第一个方法中,我们可以使用的按钮样式有:

UIBarButtonItemStyleBordered
UIBarButtonItemStyleDone
UIBarButtonItemStylePlain

效果分别如下:

          

看上去第一个和第三个样式效果是一样的。

6、添加一个右按钮

在ViewDidLoad方法最后添加代码:

//添加右按钮
UIBarButtonItem *rightButton = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemUndo
target:self
action:@selector(myAction)];
self.navigationItem.rightBarButtonItem = rightButton;

运行如下:

这里创建UIBarButtonItem用的方法是

[UIBarButtonItemalloc]initWithBarButtonSystemItem:(UIBarButtonSystemItem) target:(id) action:(SEL)

用了系统自带的按钮样式,这些样式的标签和效果如下:

                  标签       效果                        标签          效果
UIBarButtonSystemItemAction              UIBarButtonSystemItemPause         
UIBarButtonSystemItemAdd              UIBarButtonSystemItemPlay         
UIBarButtonSystemItemBookmarks              UIBarButtonSystemItemRedo         
UIBarButtonSystemItemCamera              UIBarButtonSystemItemRefresh         
UIBarButtonSystemItemCancel              UIBarButtonSystemItemReply         
UIBarButtonSystemItemCompose              UIBarButtonSystemItemRewind         
UIBarButtonSystemItemDone              UIBarButtonSystemItemSave         
UIBarButtonSystemItemEdit              UIBarButtonSystemItemSearch         
UIBarButtonSystemItemFastForward              UIBarButtonSystemItemStop         
UIBarButtonSystemItemOrganize              UIBarButtonSystemItemTrash         
UIBarButtonSystemItemPageCurl              UIBarButtonSystemItemUndo         

注意,UIBarButtonSystemItemPageCurl只能在Tool Bar上显示。

7、添加多个右按钮

在ViewDidLoad方法中最后添加代码:

//添加多个右按钮
UIBarButtonItem *rightButton1 = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:self
action:@selector(myAction)];
UIBarButtonItem *rightButton2 = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
target:nil
action:nil];
UIBarButtonItem *rightButton3 = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemEdit
target:self
action:@selector(myAction)];
UIBarButtonItem *rightButton4 = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
target:nil
action:nil];
UIBarButtonItem *rightButton5 = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemOrganize
target:self
action:@selector(myAction)];
NSArray *buttonArray = [[NSArray alloc]
initWithObjects:rightButton1,rightButton2,
rightButton3,rightButton4,rightButton5, nil];
self.navigationItem.rightBarButtonItems = buttonArray;

为了更好的显示效果,把设置titleView以及设置leftBarButtonItem的代码注释掉,运行效果如下:

上面的UIBarButtonSystemItemFixedSpace和UIBarButtonSystemItemFlexibleSpace都是系统提供的用于占位的按钮样式。

8、设置Navigation Bar背景颜色

在viewDidLoad方法后面添加代码:

//设置Navigation Bar颜色
self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:(218.0/255.0) green:(228.0 / 255.0) blue:(250.0 / 255.0) alpha:1];

运行如下:

9、设置Navigation Bar背景图片

首先将准备好作为背景的图片拖到工程中,我用的图片名称是title_bg.png。

将上面的代码改成:

//设置Navigation Bar背景图片
UIImage *title_bg = [UIImage imageNamed:@"title_bg.png"]; //获取图片
CGSize titleSize = self.navigationController.navigationBar.bounds.size; //获取Navigation Bar的位置和大小
title_bg = [self scaleToSize:title_bg size:titleSize];//设置图片的大小与Navigation Bar相同
[self.navigationController.navigationBar
setBackgroundImage:title_bg
forBarMetrics:UIBarMetricsDefault]; //设置背景

之后,在ViewController.m中添加一个方法用于调整图片大小:

//调整图片大小
- (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size{
UIGraphicsBeginImageContext(size);
[img drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return scaledImage;
}

运行:

NavigationController的更多相关文章

  1. iOS7 NavigationController 手势问题

    在iOS7中,如果使用了UINavigationController,那么系统自带的附加了一个从屏幕左边缘开始滑动可以实现pop的手势.但是,如果自定义了navigationItem的leftBarB ...

  2. navigationController 去掉背景图片、去掉底部线条

    //去掉背景图片 [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMe ...

  3. navigationController 的返回按钮自定义

    1: navigationController 的返回按钮自定义 SecondViewController *secondVC = [SecondViewController new];       ...

  4. navigationController 返回前N个视图

    前提是,由N个视图跳转过来的. //返回前n个 NSInteger index=[[self.navigationController viewControllers]indexOfObject:se ...

  5. iOS中关于NavigationController中preferredStatusBarStyle一直不执行的问题

    重点:真的能改吗?跑起来毛用没有. 1.还要在plist文件里把View controller-based status bar appearance设置成YES. 2.一定要写UINavigatio ...

  6. 整合TabBarController与NavigationController

    一.项目结构 一开始创建一个空的项目

  7. 通过navigationController跳转界面时隐藏navigationBar上的元素

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  8. iOS navigationcontroller pop 回到上一层视图 如何刷新

    1.从视图A中navigation controller push到视图B,当视图B navigationcontroller pop回到视图A时,并不会调用A的viewDidLoad,但是会调用vi ...

  9. navigationController pop的几种方法

    一,popViewControllerAnimated [self.navigationController popViewControllerAnimated:YES]; 二,popToRootVi ...

随机推荐

  1. 梦想成真,喜获微软MVP奖项,微软MVP FAQ?

    之前一直很钦佩那些MVP获奖者,想着自己有一天也能拿到该多好,就在10月1日邮箱收到了微软的邮件,当选了2016年10月份的MVP.今天主要分享一下获奖的喜悦也分享一下如何获得MVP奖项. 什么是微软 ...

  2. django model Meta选项

    可用的 Meta 选项 abstract Options.abstract 如果 abstract = True ,这个 model 就是一个 抽象基类 . app_label Options.app ...

  3. Delphi 实现数字转大写

    从网上找的一段代码 /// <summary> /// 小写转大写 /// </summary> /// <param name="mmje"> ...

  4. Python笔记(4)类__属性与描述符

    部分参考自:http://www.geekfan.net/7862/ 新式类与经典类 2和3不一样,3都是新式类. 新式类和经典类的区别: class A: #classic class " ...

  5. Object Removal by Exemplar-Based Inpainting 概括(附源码)

    关于这篇论文:其是采用基于样例的图像修复,通俗地讲就是图像其他部分的采样信息去填补遮挡区域,其与使用扩散方法的图像修补方法相比,不会产生模糊效应. 论文中涉及到的几个参数     Ω:要修补的区域 δ ...

  6. SDWebImage使用及原理

    第一步,下载SDWebImage,导入工程.github托管地址https://github.com/rs/SDWebImage 第二步,在需要的地方导入头文件 1 #import "UII ...

  7. <<< Java提取网页源码

    package com.sevennight; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io ...

  8. mysql命令总结

    统计全库数据量: use information_schema; SELECT TABLE_NAME, (DATA_LENGTH) as DataM , (INDEX_LENGTH) as Index ...

  9. Windows7微软官方原版镜像系统文件

    Windows7微软官方原版镜像系统 Windows 7 是由微软公司(Microsoft)开发的操作系统,核心版本号为Windows NT 6.1.Windows 7可供家庭及 商业工作环境.笔记本 ...

  10. 创建NetWorkDataset---Shapefile篇

    部分参照esri的官方例子,理解下各个参数,对照自己的NetWorkDatase创建方式(在arcmap中),多试试代码就调好了. /// <summary> /// 创建NetWorkD ...