導航控制器
1.UINavigationController
1.1是什么?
是一個能夠裝載多個視圖控制器的容器 (內部用數組裝視圖控制器按照添加順序加入數組)
是一種管理視圖控制器的控制器
1.2作用?
管理和控制視圖控制器的走向,比模態視圖present跳轉的方式更好,更清晰,層次感更明確;
1.3如何使用導航控制器?
a 創建一個導航控制器對象,并初始化它的根視圖控制器(至少必須有一個根視圖控制器),
b 把該導航控制器對象設置為窗口的根視圖控制器(那么,窗口上默認顯示的就是導航控制器所管理的根視圖控制器的小跟班view);
c push界面(推出下一個界面)
d pop界面(返回一個界面)
1)返回上一級
2)返回到指定的界面
3)返回到根視圖
【Demo】-【1-UINavigationController】
a,b
-
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];//1.創建導航控制器對象
ViewController1 *vc1 = [[ViewController1 alloc] init]; 【導航控制器】
UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:vc1];//2.把導航控制器對象作為窗口的根視圖控制器(窗口上默認顯示的就是導航控制器的根視圖控制器所管理的視圖)
self.window.rootViewController = nvc;return YES;
}
c push(在點擊事件里面寫以下內容)
-(void)btnClick{
//創建vc2對象
ViewController2 *vc2 = [[ViewController2 alloc] init];
//push到vc2,由導航控制器來push
[self.navigationController pushViewController:vc2 animated:YES];
}
d pop(在點擊事件里面寫以下內容)
-(void)btnClick{
//************* 1. 返回到主頁面(常用)
[self.navigationController popToRootViewControllerAnimated:YES];
//導航控制器所管理的所有的控制器對象都存放在該數組中
// NSArray *array = self.navigationController.viewControllers;
// NSLog(@"%@",array);
//2.返回到指定的界面
// [self.navigationController popToViewController:array[1] animated:YES];
//3.返回到上一級頁面
// [self.navigationController popViewControllerAnimated:YES];
}
二 導航控制器的內部原理 【重點】
1.導航控制器內部維護者一個數組,這個數組里存放的是所有被管理的視圖控制器,并且,這個數組以“棧”的方式來管理;
棧:是一種數據結構,特點:先進后出,后進先出;
2.push一個界面,對應的就是入棧操作;
3.pop一個界面,對應的就是出棧操作;
4.push進去vc,不會被釋放,只有pop出去的vc才會被銷毀;
5.不能pop根vc
三 導航欄 UINavigationBar
1)導航控制器所管理的視圖控制器公用同一個導航欄;
2)每個視圖控制器如果設置了導航欄的相關屬性,那么其他的視圖控制器界面上的導航欄會看到一樣的效果;
3)
-
(void)viewDidLoad {
[super viewDidLoad];
/********** 導航欄相關設置 **********/
//iOS7.0之前,導航欄的高度是44
//iOS7.0之后,導航欄的高度波及到了狀態欄(44+20 = 64);
//1.設置導航欄的樣式
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;//2.設置導航欄是否透明
//YES 半透明 NO 不透明
self.navigationController.navigationBar.translucent = YES;//3.設置導航欄背景層的顏色【如果不透明,設置顏色無效】
self.navigationController.navigationBar.backgroundColor = [UIColor greenColor];//4.設置導航欄的顏色
// self.navigationController.navigationBar.barTintColor = [UIColor greenColor];//5.設置導航欄的背景圖片 【重點】
//表示在豎屏下,顯示“navBg.png”這張圖片
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navBg"] forBarMetrics:UIBarMetricsDefault];//在橫屏下,顯示“navBg-32.png”這張圖片
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navBg-32.png"] forBarMetrics:UIBarMetricsCompact];
//6.隱藏導航欄
self.navigationController.navigationBarHidden = YES ;
}
-(void)btnClick{
//創建vc2對象
ViewController2 *vc2 = [[ViewController2 alloc] init];
//push到vc2,由導航控制器來push
[self.navigationController pushViewController:vc2 animated:YES]; 【切換視圖控制器】
}
四 UINavigationItem
每個視圖控制器上的導航欄顯示的item項是自己獨立的,即每個視圖控制器都可以設置自己的item項,其結構如下:
見【Demo】-【2-UINavigationItem】
UIBarButtonItem類型 【專門用于放在各種Bar上,和UIButton是不一樣的】
有4種形式來創建UIBarButtonItem對象
1.以標題的形式創建
2.以系統自帶的樣式創建
3.以圖片的形式來創建(對圖片的大小有嚴格的要求)
4.以自定義的形式來創建 【最常用】
導航欄的標題分為兩種形式:
1.title (self.title = @“”; <==> self.navigationItem.title = )
2.titleView 自定義標題視圖
3.prompt 副標題
//設置導航欄的顏色
self.navigationController.navigationBar.barTintColor = [UIColor orangeColor];
//************* 關于UINavigationItem的相關設置
//1.設置標題/Users/qianfeng/Desktop/6-圖片2
// self.title = @"返回";
//2.設置標題視圖
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 15, 15)];
titleLabel.text = @"頁面一";
titleLabel.textColor = [UIColor redColor];
titleLabel.font = [UIFont systemFontOfSize:15];
titleLabel.textAlignment = NSTextAlignmentCenter;
self.navigationItem.titleView = titleLabel; (titleView是UIView類型,所以可以添加UIView所有的子類)
//3.設置副標題
// self.navigationItem.prompt = @"副標題";
//********
//凡是navigationItem項都是UIBarButtonItem類型的對象
//1.通過標題的形式創建一個IBarButtonItem的對象
UIBarButtonItem *leftItem1 = [[UIBarButtonItem alloc] initWithTitle:@"item1" style:UIBarButtonItemStylePlain target:self action:@selector(leftItem1Click:)];
//2.通過系統自帶的樣式創建一個UIBarButtonItem對象
UIBarButtonItem *leftItem2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(leftItem2Click:)];
// self.navigationItem.leftBarButtonItem = leftItem1;
self.navigationItem.leftBarButtonItems = @[leftItem1,leftItem2];
//3.以自定義的樣式,創建UIBarButtonItem對象 【*** 最常用 ***】
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(0, 0, 15, 15);
[btn setTitle:@"下一頁" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *rightItem1 = [[UIBarButtonItem alloc] initWithCustomView:btn];
//4.以圖片的形式創建UIBarButtonItem (對圖片的大小要求很嚴格)
UIBarButtonItem *rightItem2 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"itemImage"] style:UIBarButtonItemStylePlain target:self action:@selector(rightItem2Click)];
self.navigationItem.rightBarButtonItems = @[rightItem1,rightItem2];
// self.navigationItem.rightBarButtonItem = rightItem1;
//設置下一級頁面的返回item,應該在上一級設置 【注意】
//設置返回item
UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backItem;
//********** 設置導航欄內容的渲染顏色
self.navigationController.navigationBar.tintColor = [UIColor redColor];
五 工具欄(UIToolBar) [了解]
每一個導航控制器自帶了一個工具欄,是一個UIToolBar類型的對象,默認顯示在底部(高度44),且默認是隱藏的!
//1.顯示工具欄(所有頁面公用同一個工具欄,但頁面之間的item項不一樣)
self.navigationController.toolbarHidden = NO;
//2.設置相關顏色
self.navigationController.toolbar.barTintColor = [UIColor brownColor];
//分割item
UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
self.toolbarItems = @[addItem,spaceItem,savaItem,spaceItem,editItem,spaceItem,searchItem];