UINavigationControlle 之 UINavigationBar及navigationItem关系探讨
在设置标题栏时常常遇到修改标题、修改返回按钮标题、增加一些按钮等需求,实现过程中一般会把UINavigationController、UINavigationBar、navigationItem及self.navigationController.navigationItem之间概念会混淆。
概念描述说明:
UINavigationController:是一个ViewController,导航栏控制器,其通过栈来直接控制了其下的viewController。
可通过此设置全局导航栏属性。如导航栏背景或title颜色等。子视图会继承这些属性,具体见下面“初始化UINavigationController”
UINavigationBar:是一个View,NavigaitonBar就是导航栏,位于屏幕的上方,管理整个NavigationController的navigationItem,即类似navigationController一样提供了一个栈来管理item。
UINavigationItem:是一个NSObject,一般使用在self.navigationItem, 包含了当前页面导航栏上需要显示的全部信息(
title,prompt,titleView,leftBarButtonItem,rightBarButtonItem,backBarButonItem )。其中UIBarButtonItem是一个UIBarItem,是一种专门放在UINavigationBar上的特殊button。
初始化UINavigationController
ViewController *vc = [[ViewController alloc]init]; UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:vc]; //此处可设置背景颜色及文字颜色 方法一: [navi.navigationBar setBarTintColor:[UIColor colorWithRed:20/255.0 green:155/255.0 blue:213/255.0 alpha:1.0]]; [navi.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor],NSForegroundColorAttributeName,nil]]; 方法二: //设置NavigationBar背景颜色 [[UINavigationBar appearance] setBarTintColor:[UIColor redColor]]; [[UINavigationBar appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}]; self.window.rootViewController = navi; [self.window makeKeyAndVisible];
UINavigationBar与UINavigationItem
navigationController直接控制viewControllers,然后包含的navigationBar形成整个navigationController的导航栏。
navigationBar包含整个navigationItem的栈,管理整个navigationController的navigationItem( NSArray *items 属性)。
navigationItem包含了bar视图的全部元素(如title,tileview,backBarButtonItem等),受当前viewcontroller管理,即bar形成整个nv的导航视图,然后每个nv页面的导航栏元素由所在页面的navigationItem管理。即设置当前页面的左右barbutton,用 self.navigationItem.leftBarButtonItem等。
self.navigationController.navigationItem 与 self.navigationItem
因为navigationController继承于UIViewController,因此它有navigationItem属性。设置当前界面导航栏元素时用的是navigationItem。此处应当忽略self.navigationController的navigationItem属性。
NavigationItem存放在UINavigationBar上。由下图我们可以知道一个导航控制器控制着多个视图,一个视图控制器控制一个UINavigationItem。
总结说明:
1、navigationController 管理多个viewController,是以栈的形式存放。
2、navigationBar 包含在 navigationController 中,且仅有一个,管理整个navigationController的navigationItem。
3、navigationItem包含了bar视图的全部元素。由当前的viewController管理。
4、navigationBar形成整个nv的导航视图,然后每个nv页面的导航栏元素由所在页面的navigationItem管理。
即设置当前页面的左右barbutton,用 self.navigationItem.leftBarButtonItem等。
方法一:修改返回按钮titile
UIBarButtonItem *returnButtonItem = [[UIBarButtonItem alloc] init]; returnButtonItem.title = @""; self.navigationItem.backBarButtonItem = returnButtonItem;
方法二:自定义UIBarButtonItem
self.navigationItem.leftBarButtonItem = leftItem;
方法三:自定义返回按钮
UIImage *backButtonImage = [[UIImage imageNamed:@"image1"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 30, 0, 0)]; [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; //将返回按钮的文字position设置不在屏幕上显示 [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];
设置标题
self.title = @”…”;
右侧增加按钮
UIBarButtonItem *removeButton=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(remove)]; [self.navigationItem setRightBarButtonItem:removeButton];
参考文献:https://blog.csdn.net/happysdh/article/details/50968235
上一篇: 做人做事