UIApplication
UIApplication是單例,不能手動(dòng)創(chuàng)建,不能alloc init琅摩,用[UIApplication sharedApplication]來(lái)獲得
作用 --- 做應(yīng)用級(jí)別的操作
- 1.設(shè)置圖標(biāo)消息數(shù)字
UIApplication * app = [UIApplication sharedApplication];
app.applicationIconBadgeNumber = 10;
UIUserNotificationSettings * setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
[app registerUserNotificationSettings:setting];
```
- 2.設(shè)置狀態(tài)欄
- 從iOS7開(kāi)始,系統(tǒng)提供了2種管理狀態(tài)欄的方式,UIViewController管理和UIApplication管理
- 默認(rèn)情況下确沸,狀態(tài)欄都是由UIViewController管理的偶惠,UIViewController實(shí)現(xiàn)下列方法就可以輕松管理狀態(tài)欄的可見(jiàn)性和樣式
- 狀態(tài)欄的樣式
```objc
(UIStatusBarStyle)preferredStatusBarStyle;
```
- 狀態(tài)欄的可見(jiàn)性
```objc
(BOOL)prefersStatusBarHidden;
```
- 通過(guò)UIApplication管理(一個(gè)應(yīng)用程序的狀態(tài)欄都由它統(tǒng)一管理)
![UIApplication設(shè)置狀態(tài)欄.png](http://upload-images.jianshu.io/upload_images/641084-47eb88c997cdf901.png)
```objc
UIApplication * app = [UIApplication sharedApplication];
[app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
- 3.打開(kāi)一個(gè)資源
UIApplication打開(kāi)資源的好處:不用判斷用什么軟件打開(kāi),系統(tǒng)會(huì)自動(dòng)根據(jù) 協(xié)議頭判斷:http/ftp/tel/
UIApplicationMain
- main函數(shù)中執(zhí)行了一個(gè)UIApplicationMain這個(gè)函數(shù)
int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
argc昼汗、argv:直接傳遞給UIApplicationMain進(jìn)行相關(guān)處理即可
principalClassName:指定應(yīng)用程序類名(app的象征),該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為默認(rèn)值
delegateClassName:指定應(yīng)用程序的代理類硝皂,該類必須遵守UIApplicationDelegate協(xié)議
UIWindow
什么是UIWindow常挚?
- UIWindow是一種特殊的UIView,通常在一個(gè)app中只會(huì)有一個(gè)UIWindow
- iOS程序啟動(dòng)完畢后稽物,創(chuàng)建的第一個(gè)視圖控件就是UIWindow奄毡,接著創(chuàng)建控制器的view,最后將控制器的view添加到UIWindow上贝或,于是控制器的view就顯示在屏幕上了
- 一個(gè)iOS程序之所以能顯示到屏幕上吼过,完全是因?yàn)樗蠻IWindow,也就說(shuō)咪奖,沒(méi)有UIWindow盗忱,就看不見(jiàn)任何UI界面
UIWindow的創(chuàng)建
// 1.創(chuàng)建窗口,注意窗口必須要有尺寸,尺寸跟屏幕一樣大的尺寸,窗口不要被釋放
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor redColor];
// 2.創(chuàng)建窗口的跟控制器
UIViewController *vc = [[UIViewController alloc] init];
vc.view.backgroundColor = [UIColor yellowColor];
// 3.設(shè)置窗口的跟控制器羊赵,設(shè)置后默認(rèn)就會(huì)把控制器的view添加到窗口上
self.window.rootViewController = vc;
// 4.顯示窗口
[self.window makeKeyAndVisible];
UIWindow的層級(jí)關(guān)系
// 設(shè)置窗口的層級(jí)關(guān)系
self.window1.windowLevel = UIWindowLevelStatusBar;
// 窗口的層級(jí)關(guān)系
UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert
UIWindow創(chuàng)建控制器(通過(guò)storyboard)
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
// 通過(guò)storyboard創(chuàng)建控制器
// instantiateInitialViewController:加載箭頭指向的控制器
//UIViewController * vc = [storyboard instantiateInitialViewController];
ViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"purple"];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
UIWindow創(chuàng)建控制器(通過(guò)xib)
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//nibName傳nil值的時(shí)候趟佃,controller加載xib的步驟:
1.先查找有無(wú)View這個(gè)xib,有則加載該xib
2.查找有無(wú)ViewController.xib,有則加載
ViewController * vc = [[ViewController alloc]initWithNibName:nil bundle:nil];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
加載控制器的View
view的懶加載過(guò)程
- (UIView *)view
{
if (_view == nil) {
[self loadView];
[self viewDidLoad];
}
return _view;
}
loadView
- 調(diào)用loadView時(shí)慷垮,如果有storyboard或者xib揖闸,會(huì)根據(jù)對(duì)應(yīng)的描述去創(chuàng)建view,如果沒(méi)有料身,則會(huì)創(chuàng)建一個(gè)空白的view
- 如果重寫了loadView汤纸,則系統(tǒng)不會(huì)去加載storyboard或者xib描述的view
// loadView作用:自定義控制器的view
// loadView什么時(shí)候調(diào)用:第一次使用控制器的view的時(shí)候調(diào)用
// 注意:在這個(gè)方法中如果沒(méi)有自定義view,就不能獲取控制器的view
// 一旦重寫了這個(gè)方法,就不要調(diào)用[super loadView]
// 如果重寫了這個(gè)方法芹血,就不會(huì)去加載storyboard描述的控制器的View
- (void)loadView
{
// 創(chuàng)建控制器view
self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.view.backgroundColor = [UIColor purpleColor];
}
viewDidLoad
- 在viewDidLoad中打印控制器的尺寸不準(zhǔn)確贮泞,通常在viewDidAppear中打印
#pragma mark - 控制器的view加載完成的時(shí)候調(diào)用
- (void)viewDidLoad {
}
#pragma mark - view完全顯示的時(shí)候調(diào)用
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"%@",NSStringFromCGRect(self.view.bounds));
}