視圖控制器的概念
- 視圖控制器就像個(gè)大管家,用來(lái)管理視圖的加載寿羞、卸載芹橡、橫屏豎屏顯示等操作前弯。
- 每一個(gè)界面都應(yīng)該由一個(gè)控制器來(lái)管理顯示。
- UIViewController是所有視圖控制器的父類(lèi)修肠。
- iOS提供了許多內(nèi)置的視圖控制器類(lèi),以支持標(biāo)準(zhǔn)的用戶(hù)界面部分,比如導(dǎo)航控制器(UINavigationController),標(biāo)簽欄控制器(UITabBarController),表視圖控制器(UITableViewController)等
視圖控制器與視圖的關(guān)系
- 視圖控制器是傳統(tǒng)的Model-View-Controller(MVC)設(shè)計(jì)模式中 —— 控制器
- UIViewController提供了許多控制器的基本功能,因?yàn)樗撬锌刂破鞯幕?lèi)
- 視圖控制器負(fù)責(zé)創(chuàng)建和管理一組視圖,它本身就提供了一個(gè)視圖,稱(chēng)為該控制器的根視圖(view),協(xié)調(diào)管理數(shù)據(jù)和視圖之間的交互
視圖控制器的根視圖創(chuàng)建方式
//視圖控制器是通過(guò)loadView方法創(chuàng)建的根視圖
//loadView方法調(diào)用的前提條件:
// 1贺辰、當(dāng)前視圖控制器的根視圖為空
// 2、通過(guò)getter方法訪問(wèn)當(dāng)前控制器的根視圖
- (void) loadView {
//創(chuàng)建每個(gè)控制器的根視圖
UIView *rootView = [[UIView alloc] initWithFrame: [UIScreen mainScreen].ApplicationFrame];
self.view = rootView;
self.view.backgroundColor = [UIColor redColor];
//初始化其他視圖...
}
模態(tài)視圖
- 通過(guò)視圖控制器的presentModalViewController: 方法彈出的視圖我們都稱(chēng)為模態(tài)視圖
- 模態(tài)視圖出現(xiàn)的場(chǎng)景一般是臨時(shí)彈出的窗口,譬如:登陸窗口
- 模態(tài)視圖彈出時(shí)通過(guò)modalTransitionStyle屬性設(shè)置不同的動(dòng)畫(huà)效果
- 調(diào)用 dismissModalViewControllerAnimated: 方法關(guān)閉窗口
//創(chuàng)建視圖控制器
ModalViewController *mViewCtrl =[ [ModalViewController alloc] init];
//設(shè)置視圖彈出時(shí)的動(dòng)畫(huà)效果
mc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
//通過(guò)模態(tài)視圖的形式打開(kāi)視圖控制器
[self presentModalViewController:mViewCtrl animated:YES];
模態(tài)視圖的原理
- 我們用 presentModalViewController: animated:打開(kāi)一個(gè)控制器,是把當(dāng)前控制器的根視圖添加到window上,我們都知道根視圖控制器不做顯示
- 而且我們通過(guò)設(shè)置當(dāng)前控制器的根視圖為透明時(shí),視圖下面顯示的時(shí)window,說(shuō)明上一個(gè)控制器的根視圖已經(jīng)從window上移除掉了,那么我們知道原理是否可以自己寫(xiě)一個(gè)方法彈出視圖,并添加我們自己想要的動(dòng)畫(huà)效果
//將要顯示的視圖控制器
ModalViewController *modelVC = [[ModalViewController alloc]init];
//把視圖控制器里面的根視圖添加的window上
[self.view.window addSubview:modelVC.view];
//添加動(dòng)畫(huà)效果
modelVC.view.frame = CGRectMake(320, 20, 320, self.view.frame.size.height);
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:.35];
self.view.frame = CGRectMake(-320, 20, 320, self.view.frame.size.height);
modelVC.view.frame = CGRectMake(0, 20, 320, self.view.frame.size.height);
[UIView commitAnimations];
模態(tài)視圖的使用場(chǎng)景
1嵌施、收集用戶(hù)輸入信息
2饲化、臨時(shí)呈現(xiàn)一些內(nèi)容
3、臨時(shí)改變工作模式
4吗伤、顯示一個(gè)新的view層級(jí)
這幾種情形都會(huì)暫時(shí)中斷程序正常的執(zhí)行流程,主要作用是收集或者顯示一些信息滓侍。
-
Presenting 和 Presented
- 當(dāng)我們?cè)赩iew Controller A中模態(tài)顯示View Controller B的時(shí)候,A就充當(dāng)Presenting View Controller(彈出VC),而B(niǎo)就是Presented ViewController(被彈出VC)。
- 官方文檔建議這兩者之間通過(guò)delegate實(shí)現(xiàn)交互,因此我們?cè)趯?shí)際應(yīng)用中,最好也遵守這個(gè)原則,在被彈出的VC中定義delegate,然后在彈出VC中實(shí)現(xiàn)該代理,這樣就可以比較方便的實(shí)現(xiàn)兩者之間的交互牲芋。
UIViewController控制視圖的常用方法
//創(chuàng)建載入根視圖
- (void) loadView;
//視圖載入完成
- (void) viewDidLoad;
//視圖將出現(xiàn)在屏幕前
- (void) viewWillAppear:(BOOL)animated;
//視圖已經(jīng)在屏幕上渲染完成
- (void) viewDidAppear:(BOOL)animated;
//視圖將被從屏幕上移除之前執(zhí)行
- (void) viewWillDisappear:(BOOL)animated;
//視圖已經(jīng)從屏幕上移除
- (void) viewDidDisappear:(BOOL)animated;
//接受到內(nèi)存警告
- (void) didReceiveMemoryWarning;