嚴格來講,凡是UIView的子類均可以稱爲視圖,實際上IOS的圖形界面就是視圖包含視圖的方案,絕大多數的控件都是UIView的子類,可是蘋果公司定義的視圖術語,一般是指具備相應視圖控制器的uiview及其子類,MVC架構嘛,所以這些視圖有時候也被稱爲內容視圖緩存
第一種常見的多視圖是基於導航的應用程序,該類程序擁有一個導航控制器,使用導航欄來控制一系列分層的視圖,如iphone的設置應用程序,導航控制器跟蹤所在的視圖深度,而且向你提供控制權,讓你能夠回到以前的視圖,在但願顯示具備不一樣層次結構的視圖時就能夠使用這種基於導航的應用形式架構
第二種常見的多視圖是標籤欄,它在屏幕底部顯示一行按鈕,稱之爲標籤欄,單擊某個按鈕就能激活一個新的視圖控制器,並顯示一個新的視圖iview
另外,這兩種視圖交換控制機制不是絕對獨立的,應爲視圖本質上是分層的,因此徹底能夠在一個應用程序中使用不一樣的視圖交換機制,結合標籤欄,導航欄一塊兒來對應用程序的邏輯進行控制iphone
一些應用程序使用了工具欄,工具欄的樣子和標籤欄差很少,可是他們有本質上的區別,標籤欄用於從兩個或者更多選項中選擇一個,並且只能選擇一個,工具欄能夠包含一些按鈕和一些控件ide
全部的多視圖應用程序都是使用的UIKit提供的某個具體的控制器類,好比標籤欄界面使用的是UITabBarController類實現,導航界面使用UINavigationController類實現函數
對於負責管理向當前用戶顯示哪一個界面的的控制器,咱們稱之爲根控制器,這個根控制器一般是UINavigationController或者UITabBarController的子類,也能夠是UIViewController的自定義子類工具
標籤欄應用程序中,點擊標籤欄將會跳轉到對應的標籤欄控制器中,可是點擊屏幕其餘位置,都會轉到與當前現實的內容視圖相對應的控制器中動畫
使用標籤欄應用程序,第一步是應用程序委託,在didFinishLuanchingWithOptions函數中將標籤控制器做爲程序window主控制器,代碼以下ui
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];//建立window self.switchViewController = [[SwitchViewController alloc] initWithNibName:@"SwitchViewController" bundle:nil];//建立主視圖控制器 UIView* switchView = self.switchViewController.view;//獲得主視圖控制器的view CGRect switchViewFrame = switchView.frame;//獲得view的frame大小 switchViewFrame.origin.y += [UIApplication sharedApplication].statusBarFrame.size.height; switchView.frame = switchViewFrame;//調整幾何屬性,以避免被隱藏在狀態欄後面 self.window.rootViewController = self.switchViewController; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES;
工具欄上的按鈕與其餘iOS控件不一樣,他們只支持一個目標動做方法,而且只在特定時刻觸發,至關於button的touch upsidespa
當切換標籤被按下的時候觸發切換方法,同時還應該從新定義viewDidLoad方法,以下
self.blueViewController = [[BlueViewController alloc] initWithNibName:@"BlueViewController" bundle:nil]; [self.view insertSubview:self.blueViewController.view atIndex:0];
切換方法以下
[UIView beginAnimations:@"View" context:NULL]; [UIView setAnimationDuration:0.5]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; if(self.yellowViewController.view.superview == nil) { if(self.yellowViewController == nil) { self.yellowViewController = [[YellowViewController alloc] initWithNibName:@"YellowViewController" bundle:nil]; } [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES]; [self.blueViewController.view removeFromSuperview]; [self.view insertSubview:self.yellowViewController.view atIndex:0]; } else { if(self.blueViewController == nil) { self.blueViewController = [[BlueViewController alloc] initWithNibName:@"BlueViewController" bundle:nil]; } [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES]; [self.yellowViewController.view removeFromSuperview]; [self.view insertSubview:self.blueViewController.view atIndex:0]; } [UIView commitAnimations];
接下來還須要實現didReceiveMemoryWarning方法,當內存減小到一個一個設定的水平的時候,操做系統發送給應用
if(self.blueViewController.view.superview == nil) { self.blueViewController = nil; } else { self.yellowViewController = nil; }
作內存管理
關於視圖轉換時候的動畫效果
iOS的動畫效果使用core animation組件,包括
1.
[UIView beginAnimations:@"View" context:NULL];第一個參數爲動畫塊標題,第二個爲鏈接到動畫塊的對象
2.
[UIView setAnimationDuration:0.5];
指定動畫塊的持續時間
3.
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
指定動畫塊效果
4.
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
指定動畫塊緩存,這樣使用動畫塊的時候就能夠使用這個緩存
5.
[UIView commitAnimations];調用動畫塊開始執行