說明:在Demo中Windows的根控制器為UINavigationController械荷,修改其View背景色為深藍(lán)色鸭栖,其根控制器為背景色為淺藍(lán)色的FirstViewController艺糜,NEXT按鈕push進(jìn)下一個(gè)UIViewController包各。
UINavigationController的ToolBar默認(rèn)隱藏曾雕,在FirstViewController中設(shè)置不隱藏见芹。
UINavigationController結(jié)構(gòu)解析
- UINavigationController view結(jié)構(gòu)
- UINavigationController棧結(jié)構(gòu)
UINavigationController通過push/pop方法進(jìn)行轉(zhuǎn)場,這就意味著UINavigationController管理的view controller 是棧結(jié)構(gòu)的(LIFO--先進(jìn)后出)鸯乃。如圖所示viewControllers數(shù)組就是當(dāng)前被推進(jìn)棧的view controller組成的數(shù)組
// UINavigationController的兩個(gè)屬性
@property(nonatomic,copy) NSArray<__kindof UIViewController *> *viewControllers; // 當(dāng)前在棧中view controller
@property(nullable, nonatomic,readonly,strong) UIViewController *topViewController; // 在棧頂?shù)膙iew controller
UINavigationController問題
下面通過幾個(gè)問題來補(bǔ)充說明UIViewController的其他內(nèi)容
1.topViewController的視圖是如何布局的鲸阻?
從上圖我們可以觀察到FirstViewController及UINavigationController的topViewController的大小和UINavigation的view(深藍(lán)色部分)是一樣,有時(shí)候我們又希望topViewController不要被NavigationBar和ToolBar覆蓋缨睡,這個(gè)時(shí)候我們應(yīng)該怎么設(shè)置呢鸟悴?
@property(nonatomic,assign) UIRectEdge edgesForExtendedLayout NS_AVAILABLE_IOS(7_0); // Defaults to UIRectEdgeAll
@property(nonatomic,assign) BOOL extendedLayoutIncludesOpaqueBars NS_AVAILABLE_IOS(7_0); // Defaults to NO, but bars are translucent by default on 7_0.
UIViewController有如上兩個(gè)屬性,其中edgesForExtendedLayout為UIRectEdge類型
typedef NS_OPTIONS(NSUInteger, UIRectEdge) {
UIRectEdgeNone = 0,
UIRectEdgeTop = 1 << 0,
UIRectEdgeLeft = 1 << 1,
UIRectEdgeBottom = 1 << 2,
UIRectEdgeRight = 1 << 3,
UIRectEdgeAll = UIRectEdgeTop | UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight
} NS_ENUM_AVAILABLE_IOS(7_0);
當(dāng)extendedLayoutIncludesOpaqueBars為默認(rèn)的NO且navigationBar和ToolBar均為半透明效果時(shí)設(shè)置edgesForExtendedLayout效果如下所示
這時(shí)候如果設(shè)置NavigationController的NavigationBar和ToolBar為不透明效果
[self.navigationController.navigationBar setTranslucent:NO];
[self.navigationController.toolbar setTranslucent:NO];
在extendedLayoutIncludesOpaqueBars為默認(rèn)的NO情況下設(shè)置edgesForExtendedLayout為UIRectEdgeAll奖年,效果如圖所示
self.edgesForExtendedLayout = UIRectEdgeAll;
[self.navigationController.navigationBar setTranslucent:NO];
[self.navigationController.toolbar setTranslucent:NO];
[self setExtendedLayoutIncludesOpaqueBars:NO];
這個(gè)時(shí)候如果想將FirstViewController布局到bar上面去细诸,只需要設(shè)置ExtendedLayoutIncludesOpaqueBars(延伸到不透明區(qū)域)為YES即可
self.edgesForExtendedLayout = UIRectEdgeAll;
[self.navigationController.navigationBar setTranslucent:NO];
[self.navigationController.toolbar setTranslucent:NO];
[self setExtendedLayoutIncludesOpaqueBars:YES];
總結(jié):edgesForExtendedLayout控制topViewController在UINavigationController上的布局,extendedLayoutIncludesOpaqueBars為YES時(shí)可延伸到不透明區(qū)域([bar setTranslucent:NO]來設(shè)置為不透明)
// 所以通過以下幾個(gè)屬性就可以設(shè)置topViewController在UINavigationController上的布局了
self.edgesForExtendedLayout = UIRectEdgeAll;
[self.navigationController.navigationBar setTranslucent:NO];
[self.navigationController.toolbar setTranslucent:NO];
[self setExtendedLayoutIncludesOpaqueBars:YES];
2.UINavigationController有多個(gè)view controller卻只有一個(gè)navigationBar陋守,怎么針對不同的view controller展示不同的頂欄
說明:UINavigationController由viewControllers震贵、navigationBar、toolBar組成水评,其中navigationBar中有一個(gè)items屬性的數(shù)組存放UINavigationItem數(shù)據(jù)猩系,與UINavigationController中的viewControllers一一對應(yīng)。也是棧結(jié)構(gòu)的中燥。在UINavigationItem中有title寇甸、titleView等屬性,不同的viewController持有不同的UINavigationItem疗涉,通過設(shè)置UINavigationItem的屬性可實(shí)現(xiàn)一個(gè)navigationBar為不同的viewController展示不同的頂欄的效果啦拿霉。
未完待續(xù)...