標籤:
一、簡介
一個iOS的app很少只由一個控制器組成,除非這個app極其簡單
當app中有多個控制器的時候,我們就需要對這些控制器進行管理
有多個view時,可以用一個大的view去管理1個或者多個小view
控制器也是如此,用1個控制器去管理其他多個控制器
為了便於管理控制器,iOS提供了2個比較特殊的控制器("父控制器")
UINavigationController
UITabBarController
二、使用步驟
- UINavigationController的使用步驟
- 初始化UINavigationController
- 設定UIWindow的rootViewController為UINavigationController
- 根據具體情況,通過push方法添加對應個數的子控制器
三、UINavigationController的view內部結構
注意:NavigationController的NavigationBar的 的高度 是44,不包括狀態列的狀態
四、子控制器的擷取方式 1> 擷取方式
@property(nonatomic,readonly) NSArray *childViewControllers
@property(nonatomic,copy) NSArray *viewControllers;
注意:
childViewControllers :是在UIViewController中屬性,並且唯讀
viewControllers:是在UINavigationController中的屬性
因此添加子控制器可以利用
navc.viewControllers = @[vc1,vc2];、
2> Bug
當導航控制器使用push的動畫形式添加兩個控制器的時候,然後利用childViewControllers擷取子控制器對象,列印時候,會顯示只有一個
解決辦法:動畫設定為NO 即可
五、UINavigationController的原理
導航控制器是一種棧的結構(先進後出),
-
- 使用push方法能將某個控制器壓入棧,最後入棧的控制器為棧頂控制器,更控制器為棧底控制器
第一個入棧的控制器為rootViewController
方法:
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;
六、修改導航控制器內容
// 設定標題
self.navigationItem.title
self.title
// 設定左右按鈕
self.navigationItem.leftBarButtonItem
self.navigationItem.leftBarButtonItems
self.navigationItem.rightBarButtonItem
self.navigationItem.rightBarButtonItems
// 設定標題為自訂view
self.navigationItem.titleView
// nav bar 顏色
[self.navigationController.navigationBar setBackgroundColor:[UIColor redColor]]; // 僅僅是導航條的顏色
[self.navigationController.navigationBar setTintColor:[UIColor redColor]]; // 主題(按鈕)顏色
[self.navigationController.navigationBar setBarTintColor:[UIColor redColor]]; // 導航條+狀態列顏色
// 設定bar不透明
self.navigationController.navigationBar.translucent = NO;
// 設定自訂標題屬性
// title
NSDictionary* attr = @{ NSFontAttributeName : [UIFont systemFontOfSize:10],NSForegroundColorAttributeName : [UIColor redColor] };
[self.navigationController.navigationBar setTitleTextAttributes:attr];
// titleView
UILabel* titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 44)];
titleLabel.font = [UIFont boldSystemFontOfSize:20];
titleLabel.textColor =[UIColor orangeColor];
titleLabel.textAlignment = NSTextAlignmentCenter;
titleLabel.text = @"自訂標題";
self.navigationItem.titleView = titleLabel;
// 導航條設定自訂圖片為按鈕(原始圖 不渲染)
UIImage* image = [UIImage imageNamed:@"navigationbar_friendsearch_highlighted"];
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
IOS開發UI篇-NavigationController的基本使用