UINavigationController 详解(最全的)

UINavigationController即导航控制器,是iOS里最常用的交互控件之一。下面介绍一下它的详细用法以及一些小的技巧

一.UINavigationController的结构组成

看下图,UINavigationController有Navigation bar  ,Navigation View ,Navigation toobar等组成。

UINavigationController 详解(最全的)_第1张图片


二.创建

在入口类里实现如下代码

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



你可能感兴趣的:(UINavigationController 详解(最全的))