UINavigationController即导航控制器,是iOS里最常用的交互控件之一。下面介绍一下它的详细用法以及一些小的技巧
一.UINavigationController的结构组成。
看下图,UINavigationController有Navigation bar ,Navigation View ,Navigation toobar等组成。
二.创建
在入口类里实现如下代码
- ViewController *rootVC = [[ViewController alloc]init];
- UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:rootVC];
- self.window.rootViewController = nav;
或者在根控制器里实现
- UINavigationController *nav = [[UINavigationController alloc] init];
- UIViewController *aView = [[UIViewController alloc] init];
- [nav pushViewController:aView animated:NO];//导航栏的第一个视图不要动画化
其中的rootVC就是导航控制器的根控制器,aView是根视图。
三.对导航条的设置
//添加标题
- self.navigationItem.title = @"根视图";
- //给导航条加背景图
- [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"bg"] forBarMetrics:UIBarMetricsDefault];
- //添加titleView,可以用来自定义标题格式,也可以放置图片标题,图片大小要适中
- self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"titleView.png"]];
- //改变标题的颜色
- self.navigationController.navigationBar.titleTextAttributes = [NSDictionary dictionaryWithObject:[UIColor greenColor] forKey:NSForegroundColorAttributeName];
- //添加Logo,只在第一个页面显示,一些项目的主页会用到这个需求
- UIView *shareNavleftView = [[UIView alloc] init];
- shareNavleftView.frame = CGRectMake(0, 0, 115, 35);
- UIImageView *img = [[UIImageView alloc] init];
- img.image = [UIImage imageNamed:@"logo"];
- img.autoresizingMask = UIViewAutoresizingFlexibleWidth;
- img.frame = shareNavleftView.frame;
- [shareNavleftView addSubview:img];
- self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:shareNavleftView];
- //添加左右按钮
- UIBarButtonItem * leftItem = [[UIBarButtonItem alloc]initWithTitle:@"left" style:UIBarButtonItemStylePlain target:self action:@selector(leftClick)];
- self.navigationItem.leftBarButtonItem = leftItem ;
- UIBarButtonItem * rightItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemPause target:self action:@selector(rightItemClick)];
- self.navigationItem.rightBarButtonItem = rightItem ;
- //也可以简化为一句代码
- self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"left" style:UIBarButtonItemStylePlain target:self action:@selector(leftClick)];
- self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemPause target:self action:@selector(rightItemClick)];</span>
- //隐藏导航栏
- self.navigationController setNavigationBarHidden:YES animated:YES];</span>
四.界面之间的交互,采用的是出栈、入栈的形式
//进入到下一个界面
- FirstViewController *firstVC = [[FirstViewController alloc]init];
- self.navigationController pushViewController:firstVC animated:YES];
//返回之前的界面
- [self.navigationController popViewControllerAnimated:YES];
//返回指定的界面
- [self.navigationController popToViewController:secondVC animated:YES];
//返回根视图
- [self.navigationController popToRootViewControllerAnimated:YES];
五.其他细节
- //隐藏返回按钮
- self.navigationItem.hidesBackButton =YES;
- //设置导航栏透明
- self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
- //设置导航栏下部的线不显示
- self.navigationController?.navigationBar.shadowImage = UIImage()
六.含有导航栏的视图里tableView的坐标问题
所有版本对含有导航的视图控制器中的view有影响的因素有
self.edgesForExtendedLayout
self.navigationController!.navigationBar.translucent
self.automaticallyAdjustsScrollViewInsets
self.extendedLayoutIncludesOpaqueBars
具体我另开了一篇博文: http://blog.csdn.net/riven_wn/article/details/50856625