UIApplication,UIWindow,UIViewController,UIView(layer)簡單介紹ios
一:UIApplication:單例(關於單例後面的文章中會詳細介紹,你如今只要知道,單例在應用程序的整個生命週期中只有一個對象)。程序員
App的啓動過程windows
打開程序以後-》數組
有:/*****************************************華麗的分割線******************************************/緩存
沒有:/*****************************************華麗的分割線******************************************/app
這裏有一個很是重要可是不多有人去留意的地方,也是做爲一個iOS程序員必須知道的,那就是Main函數,咱們知道Main函數是一個程序的入口,那麼在iOS開發中Main函數有哪些須要注意的地方呢:函數
argc、argv:直接傳遞給UIApplicationMain進行相關處理便可佈局
principalClassName:指定應用程序類名(app的象徵),該類必須是UIApplication(或子類)。若是爲nil,則用UIApplication類做爲默認值this
delegateClassName:指定應用程序的代理類,該類必須遵照UIApplicationDelegate協議atom
方法:
1 // app啓動完成的時候調用 2 3 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 4 5 6 7 NSLog(@"%s",__func__); 8 9 10 11 return YES; 12 13 } 14 15 16 17 // app即將失去焦點的時候調用 18 19 - (void)applicationWillResignActive:(UIApplication *)application { 20 21 NSLog(@"%s",__func__); 22 23 } 24 25 26 27 // app進入後臺 28 29 - (void)applicationDidEnterBackground:(UIApplication *)application { 30 31 NSLog(@"%s",__func__); 32 33 // 保存一些數據 34 35 36 37 } 38 39 40 41 // app即將進入前臺的時候調用 42 43 - (void)applicationWillEnterForeground:(UIApplication *)application { 44 45 NSLog(@"%s",__func__); 46 47 } 48 49 50 51 // app即將獲取焦點的時候 52 53 // 當應用程序獲取焦點的時候纔可以與用戶交互 54 55 - (void)applicationDidBecomeActive:(UIApplication *)application { 56 57 NSLog(@"%s",__func__); 58 59 } 60 61 62 63 // app關閉的時候調用 64 65 - (void)applicationWillTerminate:(UIApplication *)application { 66 67 68 69 } 70 71 72 73 // 監聽內存警告 74 75 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 76 77 { 78 79 NSLog(@"內存警告"); 80 81 // 清楚圖片緩存 82 83 } 84 85
UIApplication單例對象經常使用功能:
// 獲取應用程序的象徵
UIApplication *app = [UIApplication sharedApplication];
// 應用程序圖片的提醒數字:(這裏須要註冊)
1 app.applicationIconBadgeNumber = 100; 2 3 4 5 // 建立通知對象 6 7 UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil]; 8 9 10 11 12 13 // 註冊用戶通知 14 15 [app registerUserNotificationSettings:settings];
// 聯網狀態 1 app.networkActivityIndicatorVisible = YES;
// 設置狀態欄
1 app.statusBarHidden = NO; 2 3 app.statusBarStyle = UIStatusBarStyleLightContent;
- (BOOL)openURL:(NSURL*)url;
openURL:方法的部分功能有
1 打電話 2 3 UIApplication *app = [UIApplication sharedApplication]; 4 5 [app openURL:[NSURL URLWithString:@"tel://10086"]]; 6 7 8 9 發短信 10 11 [app openURL:[NSURL URLWithString:@"sms://10086"]]; 12 13 14 15 發郵件 16 17 [app openURL:[NSURL URLWithString:@"mailto://12345@qq.com"]]; 18 19 20 21 打開一個網頁資源 22 23 [app openURL:[NSURL URLWithString:@"http://ios.itcast.cn"]]; 24 25
二:UIWIndow
UIWindow是一種特殊的UIView,一般在一個app中至少會有一個UIWindow
iOS程序啓動完畢後,建立的第一個視圖控件就是UIWindow,接着建立控制器的view,最後將控制器的view添加到UIWindow上,因而控制器的view就顯示在屏幕上了
一個iOS程序之因此能顯示到屏幕上,徹底是由於它有UIWindow
也就說,沒有UIWindow,就看不見任何UI界面
添加UIView到UIWindow中兩種常見方式:
直接將view添加到UIWindow中,但並不會理會view對應的UIViewController
自動將rootViewController的view添加到UIWindow中,負責管理rootViewController的生命週期
經常使用方法
讓當前UIWindow變成keyWindow(主窗口)
讓當前UIWindow變成keyWindow,並顯示出來
[UIApplication sharedApplication].windows
在本應用中打開的UIWindow列表,這樣就能夠接觸應用中的任何一個UIView對象
(平時輸入文字彈出的鍵盤,就處在一個新的UIWindow中)
[UIApplication sharedApplication].keyWindow
用來接收鍵盤以及非觸摸類的消息事件的UIWindow,並且程序中每一個時刻只能有一個UIWindow是keyWindow。若是某個UIWindow內部的文本框不能輸入文字,多是由於這個UIWindow不是keyWindow
view.window
得到某個UIView所在的UIWindow
UIWindow還有一個屬性須要注意的,雖然我嗎平時不多用到:
對應de屬性值:
三:UIViewController
控制器的建立
• 瞭解UIStoryboard對象,經過這個對象,就能加載storyboard文件 注意:必需要有storyboard,建立UIStoryboard對象纔有意義,alloc init創 建UIStoryboard對象沒有意義 1.1> instantiateInitialViewController:默認加載箭頭指向的控制器
1.2> instantiateViewControllerWithIdentifier:根據標識在storyboard查找 控制器,而且建立。
○ 標識不能亂傳,會報錯的,必須storyboard有這個標識才行
經過xib建立控制器的view(空項目) • 首先得要有xib。
1 xib注意點:(演示沒有的後果) 1> xib裏面必須有一個view描述控制器的view,由於控制器的view 屬性必須有值。 2> xib須要指定描述哪個控制器,描述UIView不須要,由於xib裏 面能夠描述不少UIView,不能固定死,可是控制器就不同了,一個 xib就用來描述一個控制器。 xib裏面可能有不少view,須要拖線指明哪一個是控制器的view
2 xib和storyboard的區別 storyboard已經指定了控制器的view,不須要咱們管,xib須要咱們 手動管理。
UIViewController啓動過程
// 系統默認的作法:若是指定了storyboard或者xib,就會加載他們描述的控制器的view
1 - (void)loadView 2 3 { 4 5 6 7 } 8 9 10 11 - (UIView *)view 12 13 { 14 15 if (_view == nil) { 16 17 [self loadView]; 18 19 [self viewDidLoad]; 20 21 } 22 23 return _view; 24 25 }
總之LoadView是咱們自定義View的時候調用的,蘋果提供這個方法的目的也就是這個,因此咱們之後自定義View的時候不要在ViewDidLoad裏面實現,由於ViewDidLoad的意思是View加載完畢之後調用,那麼這個時候已經有一個View了,咱們再去建立一個View,雖然能夠,可是這不是浪費內存嗎。
1 // 1.建立窗口 2 3 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 4 5 6 7 // 設置窗口的顏色 8 9 self.window.backgroundColor = [UIColor purpleColor]; 10 11 12 13 // 2.建立根控制器,在設置窗口的根控制器 14 15 UIViewController *vc = [[UIViewController alloc] init]; 16 17 18 19 // 設置窗口的根控制器,底層會自動把根控制器的view添加到窗口上,而且讓控制器的view有旋轉功能 20 21 self.window.rootViewController = vc; 22 23 24 25 // 3.顯示窗口 26 27 // makeKeyAndVisible:讓窗口成爲應用程序的主窗口,而且顯示窗口 28 29 [self.window makeKeyAndVisible]; 30 31 32 33 return YES; 34 35
生命週期:
四:UIView(Layer)
控制器的view的建立
1> loadView做用:通常用來建立自定義的view
2> loadView何時調用:當控制器的view沒有建立的時候,就會調用loadView 去建立控制器的view.
3> loadView使用注意:若是重寫loadView裏面沒有建立控制器的view,就不能使 用self.view,會形成死循環。
注意:
重寫loadView,不是不會加載xib了嗎,控制器的view由loadView決定, loadView顯示什麼顏色,就是什麼顏色。 loadView只是建立控制器View,並不能決定控制器的view的顏色。 理解loadView的調用時刻:第一次調用self.view,底層會調用LoadView 方法,建立控制器的view,這時候的view是LoadView的顏色,可是
vc.view.backgroundColor,是拿到控制器的view又設置一次顏色,把 LoadView設置的顏色給覆蓋了。 在viewDidLoad也設置顏色,仍是vc.view.backgroundColor決定,由於
vc.view view, view
loadView只是建立控制器View,並不能決定控制器的view的顏色。
vc.view.backgroundColor,是拿到控制器的view又設置一次顏色,把 LoadView設置的顏色給覆蓋了。 在viewDidLoad也設置顏色,仍是vc.view.backgroundColor決定,由於 vc.view就是獲取控制器的view,只有控制器的view加載完成以後,才能獲取 到,所以先調用viewDidLoad。
理解loadView的調用時刻:第一次調用self.view,底層會調用LoadView 方法,建立控制器的view,這時候的view是LoadView的顏色,可是
還有一個概念值得注意的,那就是Layer那麼Layer事什麼東西呢,他有什麼用?他喝UIView又是什麼關係?
UIView中屬性與方法的詳細解釋:
1 /** 2 3 * 經過一個frame來初始化一個UI控件 4 5 */ 6 7 - (id)initWithFrame:(CGRect)frame; 8 9 10 11 // YES:可以跟用戶進行交互 12 13 @property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteractionEnabled; // default is YES 14 15 16 17 // 控件的一個標記(父控件能夠經過tag找到對應的子控件) 18 19 @property(nonatomic) NSInteger tag; // default is 0 20 21 22 23 // 圖層(能夠用來設置圓角效果\陰影效果) 24 25 @property(nonatomic,readonly,retain) CALayer *layer; 26 27 28 29 @end 30 31 32 33 @interface UIView(UIViewGeometry) 34 35 // 位置和尺寸(以父控件的左上角爲座標原點(0, 0)) 36 37 @property(nonatomic) CGRect frame; 38 39 40 41 // 位置和尺寸(以本身的左上角爲座標原點(0, 0)) 42 43 @property(nonatomic) CGRect bounds; 44 45 46 47 // 中點(以父控件的左上角爲座標原點(0, 0)) 48 49 @property(nonatomic) CGPoint center; 50 51 52 53 // 形變屬性(平移\縮放\旋轉) 54 55 @property(nonatomic) CGAffineTransform transform; // default is CGAffineTransformIdentity 56 57 58 59 // YES:支持多點觸摸 60 61 @property(nonatomic,getter=isMultipleTouchEnabled) BOOL multipleTouchEnabled; // default is NO 62 63 @end 64 65 66 67 @interface UIView(UIViewHierarchy) 68 69 // 父控件 70 71 @property(nonatomic,readonly) UIView *superview; 72 73 74 75 // 子控件(新添加的控件默認都在subviews數組的後面, 新添加的控件默認都顯示在最上面\最頂部) 76 77 @property(nonatomic,readonly,copy) NSArray *subviews; 78 79 80 81 // 得到當前控件所在的window 82 83 @property(nonatomic,readonly) UIWindow *window; 84 85 86 87 // 從父控件中移除一個控件 88 89 - (void)removeFromSuperview; 90 91 92 93 // 添加一個子控件(能夠將子控件插入到subviews數組中index這個位置) 94 95 - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index; 96 97 98 99 // 交換subviews數組中所存放子控件的位置 100 101 - (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2; 102 103 104 105 // 添加一個子控件(新添加的控件默認都在subviews數組的後面, 新添加的控件默認都顯示在最上面\最頂部) 106 107 - (void)addSubview:(UIView *)view; 108 109 110 111 // 添加一個子控件view(被擋在siblingSubview的下面) 112 113 - (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview; 114 115 116 117 // 添加一個子控件view(蓋在siblingSubview的上面) 118 119 - (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview; 120 121 122 123 // 將某個子控件拉到最上面(最頂部)來顯示 124 125 - (void)bringSubviewToFront:(UIView *)view; 126 127 128 129 // 將某個子控件拉到最下面(最底部)來顯示 130 131 - (void)sendSubviewToBack:(UIView *)view; 132 133 134 135 /**系統自動調用(留給子類去實現)**/ 136 137 - (void)didAddSubview:(UIView *)subview; 138 139 - (void)willRemoveSubview:(UIView *)subview; 140 141 142 143 - (void)willMoveToSuperview:(UIView *)newSuperview; 144 145 - (void)didMoveToSuperview; 146 147 - (void)willMoveToWindow:(UIWindow *)newWindow; 148 149 - (void