UINavigationController
【导航控制器】
首先需要在代理AppDelegate.m里边做设置
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
ViewController *vc = [[ViewController alloc]init];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:vc];
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
可以统一设置导航视图控制器
// 设置title颜色,这个方法的参数是个字典
// NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor redColor],NSForegroundColorAttributeName, nil];
//
// //统一设置 导航视图控制器的颜色(多个导航视图控制器)
// [[UINavigationBar appearance] setTitleTextAttributes:dict];
UINavigationController是导航控制器,是一个容器视图控制器,用于切换具有层次关系的视图,而非同一级视图间的切换。
1、视图控制器之间的切换
a、向导航控制器压入一个新的视图控制器
[self.navigationController pushViewController:svc animated:YES];
b、从导航控制器弹出最顶层的视图控制器(上一级)
[self.navigationController popViewControllerAnimated:YES];
c、从导航控制器弹出到指定的视图控制器
先从数组里边找到视图控制器
[self.navigationController popToViewController:controllers[1] animated:YES];
d、从导航控制器弹出到根视图控制器
[self.navigationController popToRootViewControllerAnimated:YES];
2、定制UINavigationBar
a、是否半透明
bar.translucent = NO;
b、设置背景图片
[bar setBackgroundImage:bgImage forBarMetrics:UIBarMetricsDefault];
c、设置导航条风格,会影响状态栏的黑白显示
bar.barStyle = UIBarStyleDefault;
d、设置背景色,测试时不要设置背景图
//iOS7.0之后设置背景色
bar.barTintColor = [UIColor whiteColor];
//iOS7.0之前设置背景色,7.0之后用于设置返回按钮的颜色
bar.tintColor = [UIColor blackColor];
e、隐藏 / 显示导航栏
[self.navigationController setNavigationBarHidden:NO animated:YES];
//导航条的高度64
//状态栏 20
//导航条的颜色默认是半透明(毛玻璃)效果,这个时候视图控制器的原点坐标是 屏幕的左上角。如果去掉毛玻璃效果,原点坐标是从导航栏下边开始
self.navigationController.navigationBar.translucent = NO;
//同一层次的导航控制子视图,他们只有一个navigationBar
//设置导航条颜色
self.navigationController.navigationBar.barTintColor = [UIColor cyanColor];
//返回按钮的颜色(镂空颜色)
self.navigationController.navigationBar.tintColor = [UIColor blueColor];
//设置title颜色,这个方法的参数是个字典
// NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor redColor],NSForegroundColorAttributeName, nil];
// [self.navigationController.navigationBar setTitleTextAttributes:dict];
//统一设置 导航导航视图控制器的颜色(多个导航视图控制器)
// [[UINavigationBar appearance] setTitleTextAttributes:dict];
//设置navigation背景图片
// UIBarMetricsDefault,普通模式也叫人像模式,竖屏
// UIBarMetricsCompact,风景模式,横屏
//如果只设置了竖屏下的背景图片,横屏也默认这个背景图片
//如果图片高度为64的话,导航栏样式就是iOS7之后的融合样式
// UIImage *image64 = [UIImage imageNamed:@"header_bg64"];
// [self.navigationController.navigationBar setBackgroundImage:image64 forBarMetrics:UIBarMetricsDefault];
//高度44 ,导航栏是跟状态栏分开的
// UIImage *image44 = [UIImage imageNamed:@"header_bg"];
//高度是42,宽度是10像素,这个时候平铺了图片
//只要不是44或者64,都会充满64像素去平铺
// UIImage *image42 = [UIImage imageNamed:@"bg_navigationBar"];
// [self.navigationController.navigationBar setBackgroundImage:image42 forBarMetrics:UIBarMetricsDefault];
//导航条的样式
// UIBarStyleDefault = 0,
// UIBarStyleBlack = 1,
//
// UIBarStyleBlackOpaque = 1, // Deprecated. Use UIBarStyleBlack
// UIBarStyleBlackTranslucent = 2, // Deprecated. Use UIBarStyleBlack and set the translucent property to YES
[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];
//隐藏/显示导航栏
//[self.navigationController setNavigationBarHidden:YES];
3、定制UINavigationItem
返回按钮的定制原则:
a、若当前页设置了leftBarButtonItem(s),则优先显示自己定制的
b、若没有设置leftBarButtonItem(s),则要看上一页的title和
backBarButtonItem,其中后者优先但是不建议使用
c、设置title的方式有两种self.title和self.navigationItem.title;
它们两个其实是设置的同一个,最后设置的有效。
//找到NavigationItem
UINavigationItem *item = self.navigationItem;
item.title = @"第二个";
//self.title 与 item.title都能设置导航栏的标题,但是最后设置的有效
//titleView 标题视图
UIView *view1 = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 30)];
view1.backgroundColor = [UIColor redColor];
item.titleView = view1;
//item只对本视图控制器有效
//第一个参数 创建一个系统风格的item
//第二个参数 事件接受者
//第三个参数 事件
UIBarButtonItem *baritem1 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:self action:@selector(baritem1Pressed:)];
//设置右边的item
item.rightBarButtonItem = baritem1;
UIBarButtonItem *baritem2 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:self action:@selector(baritem2Pressed:)];
//设置左边的item
// item.leftBarButtonItem = baritem2;
UIBarButtonItem *baritem3 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(baritem3Pressed:)];
//用文字设置BarButtonItem
// UIBarButtonItemStylePlain,
// UIBarButtonItemStyleBordered NS_ENUM_DEPRECATED_IOS(2_0, 8_0, "Use UIBarButtonItemStylePlain when minimum deployment target is iOS7 or later"),
// UIBarButtonItemStyleDone,
UIBarButtonItem *textItem = [[UIBarButtonItem alloc]initWithTitle:@"确定" style:UIBarButtonItemStylePlain target:self action:nil];
//用图片创建item
UIImage *image = [UIImage imageNamed:@"btn_feedCell_collection_selected"];
//用图片的最原始模式
UIBarButtonItem *imageItem = [[UIBarButtonItem alloc]initWithImage:[image imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:nil];
//用视图创建
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setImage:[UIImage imageNamed:@"btn_increase"] forState:UIControlStateNormal];
btn.frame = CGRectMake(0, 0, 40, 40);
[btn addTarget:self action:@selector(btnItemPressed:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *viewItem = [[UIBarButtonItem alloc]initWithCustomView:btn];
//用数组来设置item
item.leftBarButtonItems = @[baritem2,baritem3,textItem,imageItem,viewItem];
//定制返回按钮
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:nil];
item.backBarButtonItem = backItem;
4、图片的拉伸
UIImage *image = [UIImage imageNamed:@"Pasted Graphic.tiff"];
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 200, 270, 150)];
//UIEdgeInsets也是一个结构体 上左下右,就是离四条边的距离
//指定cap到边的部分不会不会被拉伸,其余部分会拉伸,尤其是要注意的是,拉伸的时候是从左到右,从上到下,通俗点说,拉伸不是全方向的拉伸,而是(先)垂直和(后)水平叠加。
image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(20, 100, 10, 10)];
imageView.image = image;
[self.view addSubview:imageView];
/**
* 自定义返回按钮
*/
- (void)customBackItem {
//btn_navigationBar_back
UIImage *image = [UIImage imageNamed:@"btn_navigationBar_back"];
//第一种风格的返回按钮 文字和箭头
UIBarButtonItem *item = [[UIBarButtonItem alloc]init];
[item setBackButtonBackgroundImage:[image resizableImageWithCapInsets:UIEdgeInsetsMake(0, image.size.width, 0, 0)] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
self.navigationItem.backBarButtonItem = item;
//第一种风格的返回按钮 箭头
// UIBarButtonItem *item = [[UIBarButtonItem alloc]init];
// [item setBackButtonBackgroundImage:[image resizableImageWithCapInsets:UIEdgeInsetsMake(0, image.size.width, 0, 0)] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
// //设置返回按钮的文字不显示
// [item setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, NSIntegerMin) forBarMetrics: UIBarMetricsDefault];
//
// self.navigationItem.backBarButtonItem = item;
}
4、定制UIToolbar
a、背景色以及背景图
b、定制toolbarItems
/**
* 自定义toolbar,每个在导航控制器只有一个toolbar,但是上面的item需要定制
*/
- (void)customToolBar {
[self.navigationController setToolbarHidden:NO];
UIBarButtonItem *item = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil];
UIBarButtonItem *item1 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:nil action:nil];
//自动挤压两边的item,也是用来占位的
// UIBarButtonSystemItemFlexibleSpace,
//固定宽度,不显示,用来占位的
// UIBarButtonSystemItemFixedSpace,
UIBarButtonItem *itemSpace = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
itemSpace.width = 100;
self.toolbarItems = @[item,itemSpace,item1];
}
界面将来消失,下一个界面不显示ToolBar
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
//隐藏toolbar
[self.navigationController setToolbarHidden:YES animated:YES];
}
已经显示过的界面,保证再次出现任有ToolBar
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self.navigationController setToolbarHidden:NO animated:YES];
}