在設置標題欄時常常遇到修改標題、修改返回按鈕標題、增加一些按鈕等需求,實現過程中一般會把UINavigationController、UINavigationBar、navigationItem及self.navigationController.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