一.View Controller Classes
二.自定義UIVIewController
1.創(chuàng)建
a)nib文件
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- {
- self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
- // Override point for customization after application launch.
- self.firstViewController = [[[FirstViewController alloc] initWithNibName:@"FirstView" bundle:nil] autorelease];
- self.window.rootViewController = self.firstViewController;
- self.firstViewController.wantsFullScreenLayout=YES;
- [self.window makeKeyAndVisible];
- return YES;
- }
如果你自定義controller實(shí)現(xiàn)initWithCoder:方法的話則會(huì)調(diào)用,,如果沒(méi)有實(shí)現(xiàn),,則調(diào)用init.
在調(diào)用完后,框架會(huì)自動(dòng)調(diào)用controller中的objects(一般是UIView)的awakeFromNib方法,,讓objects可以有機(jī)會(huì)來(lái)初始化自己.
b)手動(dòng)創(chuàng)建
只需要alloc&init方式就可以了
2.初始化
一般在controller中實(shí)現(xiàn)loadView方法來(lái)實(shí)現(xiàn)第一次的controller內(nèi)容的管理,,值得注意的是,如果自己實(shí)現(xiàn)了這個(gè)方法,,則不需要調(diào)用super的loadView方法
3.設(shè)置root view controller的尺寸
a)window的尺寸
b)是否有status bar
c)設(shè)備的方向(橫向豎向)
d)root view controller的wantsFullScreenLayout屬性,。這個(gè)屬性就是設(shè)置是否要包含狀態(tài)欄20像素,比方說(shuō)你在view里設(shè)置了一個(gè)button在頂部,,這個(gè)如果是true,則button出現(xiàn)在狀態(tài)欄下,,如果是false,則會(huì)自動(dòng)頂下去,。本身并不影響status bar的隱藏和消失。只是決定status bar下面是否屬于程序繪制區(qū)域而已,。
4.布局
首先可以利用每個(gè)view的autoresizingMask的設(shè)置來(lái)自動(dòng)布局
viewcontroller布局改變的順序
a)view controller的vew尺寸改變
b)調(diào)用controller的viewWillLayoutSubview.
c)調(diào)用view的layoutSubview
d)autolayout布局,調(diào)用controller的updateViewConstraints
e)如果有必要,,可以在controller調(diào)用對(duì)應(yīng)view的updateConstraints
f)調(diào)用controller的viewDidLayoutSubview.
三.View Controller的生存周期
1.初始化方法:init,initWithCoder;
2.加載controller's view:loadView: controller.view=nil; viewDidLoad: controller.view=view;
3.當(dāng)收到didREceiveMemoryWarning的時(shí)候會(huì)調(diào)用viewWillUnload,viewDidUnload;
4.dealloc:釋放資源(ARC可以忽略)
四.支持界面旋轉(zhuǎn)
1.聲明支持的旋轉(zhuǎn)方向
shouldAutorotateToInterfaceOrientation:決定支持的旋轉(zhuǎn)方向(UIInterfaceOrientationIsLandscape的橫向2個(gè)方向 UIInterfaceOrientationIsPortrait豎直2個(gè)方向)
2.如何處理方向改變
a)方向發(fā)生改變
b)調(diào)用shouldAutorotateToInterfaceOrientation查看支持的方向
c)調(diào)用controller的willRotateToInterfaceOrientation:duration方法
d)觸發(fā)view的自動(dòng)布局(詳細(xì)的看第二部分的第4點(diǎn):布局)
e)調(diào)用didRotateFromInterfaceOrientation方法
3.為每個(gè)方向創(chuàng)建不同的界面
利用notification來(lái)通知不同的狀態(tài)。
- @implementation PortraitViewController
- - (void)awakeFromNib
- {
- isShowingLandscapeView = NO;
- [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(orientationChanged:)
- name:UIDeviceOrientationDidChangeNotification
- object:nil];
- }
-
- - (void)orientationChanged:(NSNotification *)notification
- {
- UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
- if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
- !isShowingLandscapeView)
- {
- [self performSegueWithIdentifier:@"DisplayAlternateView" sender:self];
- isShowingLandscapeView = YES;
- }
- else if (UIDeviceOrientationIsPortrait(deviceOrientation) &&
- isShowingLandscapeView)
- {
- [self dismissViewControllerAnimated:YES completion:nil];
- isShowingLandscapeView = NO;
- }
- }
4.處理旋轉(zhuǎn)的小貼士
a)暫時(shí)禁止任何事件響應(yīng)
b)存儲(chǔ)已經(jīng)顯示的地圖區(qū)域(地圖應(yīng)用中)
c)如果界面的view層次太過(guò)復(fù)雜而造成延遲,,建議先做view的截圖,,相關(guān)方法我其它博客文章中有提到
d)旋轉(zhuǎn)后,,對(duì)于tableView的話,,需要reload重新讀取數(shù)據(jù)。
e)使用旋轉(zhuǎn)通知來(lái)更新應(yīng)用信息,。
五.view顯示相關(guān)的通知
1.方法有viewWillAppear: viewDidAppear: viewWillDisappear: viewDidAppear:
2.注意這個(gè)是controller.view被設(shè)置值或者controller.view被設(shè)置成nil調(diào)用的,,當(dāng)然這個(gè)值未必就是直接設(shè)置的,可能是通過(guò)controller的顯示和移除的,。
3.知道view顯示移除的原因,,在上述4個(gè)方法中調(diào)用isMovingFromParentViewController,isMovingToParentViewController,isBeingPresented,isBeingDismissed 。
六.viewController顯示(關(guān)閉)其它viewController
在5.0之前,,對(duì)應(yīng)的方法是使用model view controller系列的方法,。5.0以后增加了presented,prensentingViewController的概念,modalViewController對(duì)應(yīng)5.0后的presentedViewController
- FCDemoViewController *controller= [[FCDemoViewController alloc]initWithNibName:@"FCDemoViewController" bundle:nil];
- controller.modalTransitionStyle=UIModalTransitionStyleFlipHorizontal;
- [self presentModalViewController:controller animated:YES];
- NSLog(@"%@",self.modalViewController);
- //5.0
- [self presentViewController:controller animated:YES completion:nil];
- NSLog(@"%@",self.presentedViewController);
- NSLog(@"%@",self.presentingViewController);
屬性modalPresentationStyle在iPad下有幾種顯示形式,,對(duì)應(yīng)不同的顯示區(qū)域,。屬性modellTransitionStyle決定過(guò)渡形式.
關(guān)閉也有對(duì)應(yīng)的方法:dismissModalViewControllerAnimated或iOS5.0以后的dismissViewControllerAnimated:completion:
5.0以后其它的變化:
controller可以自定義子controller的集合,這樣每一個(gè)controller都可以是一個(gè)container controller.
definesPresentationContext決定當(dāng)前顯示其它c(diǎn)ontroller的controller是否提供context給presentedViewController(modalViewController),如果不,,就會(huì)找上一級(jí)的controller的該值,。
詳細(xì)的操作可以查看class reference.
蘋果官方推薦使用協(xié)議的方式來(lái)讓controller相互通信。首先聲明一個(gè)協(xié)議,,并在主controller中實(shí)現(xiàn)該協(xié)議的方法,,在顯示其它c(diǎn)ontroller的時(shí)候,為其設(shè)置delegate=self.這樣在其它c(diǎn)ontroller需要回調(diào)presentingViewController就可以直接用delegate方法來(lái)回調(diào)到它,。通過(guò)這樣的方式,,可以使得復(fù)用性大大增強(qiáng)。而且被顯示的controller也不用完全知道顯示它的controller的所有信息和屬性,。
七.controller的edit mode
1.當(dāng)設(shè)置controller的editing屬性,,會(huì)自動(dòng)觸發(fā)setEditing:animated屬性,這個(gè)時(shí)候通過(guò)myController editButtonItem獲得的編輯按鈕會(huì)自動(dòng)從edit變成Done,,這個(gè)通常使用在navigation Controller
比如設(shè)置一個(gè)右上角按鈕為editButton的話代碼如下
- myViewController.navigationItem.rightBarButtonItem=[myViewController editButtonItem];
|