一、簡介
在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,這三種視圖切換的原理各不相同:
- UITabBarController :以平行的方式管理視圖,各個視圖之間往往關系并不大,每個加入到UITabBarController的視圖都會進行初始化即使當前不顯示在界面上,相對比較占用內存。
- UINavigationController:以棧的方式管理視圖,各個視圖的切換就是壓棧和出棧操作,出棧后的視圖會立即銷毀。
- 模態窗口:以模態窗口的形式管理視圖,當前視圖關閉前其他視圖上的內容無法操作。
二、UITabBarController
-
介紹
UITabBarController是Apple專門為了利用頁簽切換視圖而設計的,在這個視圖控制器中有一個UITabBar控件,用戶通過點擊tabBar進行視圖切換。我們知道在UIViewController內部有一個視圖,一旦創建了UIViewController之后默認就會顯示這個視圖,但是UITabBarController本身并不會顯示任何視圖,如果要顯示視圖則必須設置其viewControllers屬性(它默認顯示viewControllers[0])。這個屬性是一個數組,它維護了所有UITabBarController的子視圖。為了盡可能減少視圖之間的耦合,所有的UITabBarController的子視圖的相關標題、圖標等信息均由子視圖自己控制,UITabBarController僅僅作為一個容器存在。下面顯示了UITabBarController的效果:
-
使用方法
主要流程
- 在AppDelegate中創建TabBarController和需要加載的ViewController。比如分別為tabBar, firstPage, secondPage
- 把視圖裝進tabBar的viewControllers屬性:
tabBar.viewControllers = @[firstPage, secondPage];
- 加載tabBar
修飾
- UITabBarController會一次性初始化所有子控制器,但是默認只加載第一個控制器視圖,其他視圖控制器只初始化默認不會加載,為了能夠將其他子控制器也正常顯示在Tab bar中我們訪問了每個子視圖控制器的視圖以便調用其視圖加載方法(viewDidLoad)具體操作:
for (UIViewController *controller in tabBar.viewControllers) {
UIView *view = controller.view;
} - 每個視圖控制器都有一個tabBarItem屬性,通過它控制視圖在UITabBarController的tabBar中的顯示信息,tabBarItem的屬性主要有
- title
- image
- selectedImage
- badgeValue
- tabBarItem的image屬性必須是png格式(建議大小32*32)并且打開alpha通道否則無法正常顯示。
- 每個視圖控制器都有一個tabBarController屬性,通過它可以訪問所在的UITabBarController
三、UINavigationController
-
介紹
UINavigationController是一個導航控制器,它用來組織有層次關系的視圖,在UINavigationController中子控制器以棧的形式存儲,只有在棧頂的控制器能夠顯示在界面中,一旦一個子控制器出棧則會被銷毀。UINavigationController默認也不會顯示任何視圖(這個控制器自身的UIView不會顯示),它必須有一個根控制器rootViewController,而且這個根控制器不會像其他子控制器一樣被銷毀。
下面顯示了UITabBarController的效果:
-
使用方法
主要流程
- 創建視圖控制器root, firstPage, secondPage
- 在AppDelegate中創建NavigationController并設置其根控制器
RootViewController *root = [[RootViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:tabBar]; - window的rootViewController設置為nav
- 導航跳轉動作為堆棧操作,在子視圖中可以通過navigationController訪問導航控制器, 然后使用pushViewController 方法把FirstPage推進棧內,animated表示切換視圖時的動畫效果:滑入還是簡單切換
[self.navigationController pushViewController:FirstPage animated:Yes];
修飾
在AppDelegate中設置導航欄的全局外觀
[[UINavigationBar appearance] setBarTintColor:[UIColor orangeColor]];
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];-
在各個層級視圖中設置導航欄的選項內容主要有:
self.navigationItem.title
self.navigationItem.leftBarButtonItem
self.navigationItem.rightBarButtonItem
UINavigationController導航是通過上方導航欄進行的(類似的UITabBarController是通過下方UITabBar進行導航),每個放到UINavigationController棧中的子視圖都會顯示一個導航欄,可以通過子控制器(包括根控制器)的navigationItem訪問這個導航欄,修改其左右兩邊的按鈕內容。
默認情況下除了根控制器之外的其他子控制器左側都會在導航欄左側顯示返回按鈕,點擊可以返回上一級視圖,同時按鈕標題默認為上一級視圖的標題,可以通過backBarButtonItem修改。下一級子視圖左側返回按鈕上的標題的顯示優先級為: 導航欄返回按鈕backBarButtonItem的標題(注意不能直接給backBarButtonItem的標題賦值,只能重新給backBarButtonItem賦值)、導航欄navigationItem的標題,視圖控制器標題。
Tips 使用系統自帶的UIBarButtonItem
typedef NS_ENUM(NSInteger, UIBarButtonSystemItem) {
UIBarButtonSystemItemDone,
UIBarButtonSystemItemCancel,
UIBarButtonSystemItemEdit,
UIBarButtonSystemItemSave,
UIBarButtonSystemItemAdd,
UIBarButtonSystemItemFlexibleSpace,
UIBarButtonSystemItemFixedSpace,
UIBarButtonSystemItemCompose,
UIBarButtonSystemItemReply,
UIBarButtonSystemItemAction,
UIBarButtonSystemItemOrganize,
UIBarButtonSystemItemBookmarks,
UIBarButtonSystemItemSearch,
UIBarButtonSystemItemRefresh,
UIBarButtonSystemItemStop,
UIBarButtonSystemItemCamera,
UIBarButtonSystemItemTrash,
UIBarButtonSystemItemPlay,
UIBarButtonSystemItemPause,
UIBarButtonSystemItemRewind,
UIBarButtonSystemItemFastForward,
UIBarButtonSystemItemUndo NS_ENUM_AVAILABLE_IOS(3_0),
UIBarButtonSystemItemRedo NS_ENUM_AVAILABLE_IOS(3_0),
UIBarButtonSystemItemPageCurl NS_ENUM_AVAILABLE_IOS(4_0),
};
四、模態窗口
模態窗口使用起來比較容易,一般的視圖控制器只要調用兩個方法
-
[self presentViewController:secondPage animated:YES completion:nil];
切換到secondPage視圖 -
[self dismissViewControllerAnimated:YES completion:nil];
注銷當前視圖返回上一級視圖
這兩種方法通過頁面按鈕來觸發。
1
1