一、UINavigationController介紹
1.1、簡介
UINavigationController manages a stack of view controllers and a navigation bar.
It performs horizontal view transitions for pushed and popped views while keeping the navigation bar in sync.
Most clients will not need to subclass UINavigationController.
If a navigation controller is nested in a tabbar controller, it uses the title and toolbar attributes of the bottom view controller on the stack.
UINavigationController is rotatable if its top view controller is rotatable.
Navigation between controllers with non-uniform rotatability is currently not supported.
導航控制器,可以輕松完成多個控制器之間的切換,其結構包含導航條、棧頂控制器的view、導航控制器的view。導航控制器需要設置一個根控制器,一般是UIViewController.
UINavigationBar: 是一個View,NavigaitonBar就是導航欄,位于屏幕的上方,管理整個NavigationController的navigationItem,即類似navigationController一樣提供了一個棧來管理item。
UINavigationItem: 是一個NSObject,一般使用在self.navigationItem, 包含了當前頁面導航欄上需要顯示的全部信息(
title,prompt,titleView,leftBarButtonItem,rightBarButtonItem,backBarButonItem )。其中UIBarButtonItem是一個UIBarItem,是一種專門放在UINavigationBar上的特殊button。
UIToolbar: 是tool條,包括image,文字title
1.2、基本使用
1、初始化
UINavigationController *nav = [[UINavigationController alloc] init];
2、設置
window.rootViewController = nav;
[window makeKeyAndVisible];
3、基本方法
1 //UINavigationController以棧的形式保存子控制器
2 @property(nonatomic,copy) NSArray *viewControllers;
3 @property(nonatomic,readonly) NSArray *childViewControllers;
4
5 //使用push方法能將某個控制器壓入棧
6 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
7
8 //使用pop方法可以移除控制器
9 //將棧頂的控制器移除
10 - (UIViewController *)popViewControllerAnimated:(BOOL)animated;
11 //回到指定的子控制器
12 - (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
13 //回到根控制器(棧底控制器)
14 - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;
4、修改導航欄的基本內容
1 //導航欄的內容由棧頂控制器的navigationItem屬性決定
2
3 //UINavigationItem有以下屬性影響著導航欄的內容
4 //左上角的返回按鈕
5 @property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
6 //中間的標題視圖
7 @property(nonatomic,retain) UIView *titleView;
8 //中間的標題文字
9 @property(nonatomic,copy) NSString *title;
10 //左上角的視圖
11 @property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
12 //右上角的視圖
13 @property(nonatomic,retain)UIBarButtonItem *rightBarButtonItem
1.3、實際開發過程中一些問題
1、UINavigationBar背景顏色
//背景色
self.navigationBar.barTintColor = [UIColor blueColor];
//title字體
//[self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor lightGrayColor],NSFontAttributeName:[UIFont systemFontOfSize:17]}];
//修改UIBarButtonItem 圖片 title顏色
self.navigationBar.tintColor = [UIColor greenColor];
//是否半透明 當為YES時 設置的導航欄背景顏色會和實際rgb值有誤差
self.navigationBar.translucent = NO;
//如果想要半透明效果 顏色沒有色差 可以通過設置背景圖片的方法 背景圖片會覆蓋barTintColor
//- (void)setBackgroundImage:(nullable UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics
2、自定義導航欄的返回按鈕
//修改圖片文字顏色
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
//替換圖片
[self.navigationController.navigationBar setBackIndicatorImage:[UIImage imageNamed:@"erwema"]];
[self.navigationController.navigationBar setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"erwema"]];
//設置文字
UIBarButtonItem * backBarItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarItem;
1.4、易混淆的知識點
1、self.title、self.navigationItem.title self.tabBarItem.title之間的關系
1、如果當前控制器通過self.navigationItem.titleView指定了自定義的titleView,系統將會顯示指定titleView,設置self.title、self.navigationItem.title不會改變導航欄標題
2、如果當前控制器沒有指定titleView,系統則會根據當前的控制器的title或者當前navigationItem.title的內容創建一個UILabel并顯示。
3、self.title會重寫navigationItem和tabBarItem的title
2、self.navigationItem,self.navigationController.navigationItem的關系
navigation是UIViewController的一個屬性,navigationController繼承UIViewController,navigationItem直接有ViewController管理。
1.5、 UINavigationTransitionView 內容區
在iOS 7.0之前我們的導航欄是擬物化風格的,導航條是不透明的,內容區是在導航欄下緊挨著的(Y值從64開始)
但是從iOS 7.0以后 我們的導航欄變成了扁平化風格,導航欄是透明的了,也就是說ViewController默認使用全屏布局
為了更好的過渡,蘋果從iOS 7.0以后新增了幾個屬性
1、edgesForExtendedLayout
edgesForExtendedLayout是一個類型為UIRectEdge的屬性,可以指定邊緣要延伸的方向。因為iOS7之后鼓勵全屏布局,它的默認值是UIRectEdgeAll,四周邊緣均延伸,就是說如果即使視圖中上有navigationBar,下有tabBar,那么視圖仍會延伸覆蓋到四周的區域。
2、extendedLayoutIncludesOpaqueBars
擴展布局是否包括不透明的Bars,默認為NO
蘋果這樣做其實是很人性化的,如果bars不透明的情況下,再使擴展布局到bars的下方,這樣感覺是毫無意義的,所以在bars不透明的情況下,默認不會延伸布局
3、 automaticallyAdjustsScrollViewInsets
那么,當我們不想讓系統自動為我們下移時我們可以這樣設置:
if (@available(iOS 11.0, *)) {
self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
self.automaticallyAdjustsScrollViewInsets = NO;
}
導航欄調整。自定義導航欄未完待續、、、、
END.....