UIApplication,UIWindow,UIViewController,UIView(layer)
轉載自:http://www.cnblogs.com/iCocos/p/4684749.html
?
UIApplication,UIWindow,UIViewController,UIView(layer)簡單介紹
?
?
一:UIApplication:單例(關于單例后面的文章中會詳細介紹,你現在只要知道,單例在應用程序的整個生命周期中只有一個對象)。
?
App的啟動過程
打開程序之后-》
?
- 1:Main函數
?
- 2:UIapplicationMain函數
?
- 3:初始化UIApplication(創建)
?
- 4:設置UIApplication代理和相應的代理屬性
?
- 5:開啟事件循環,監聽系統事件
?
- 6監測info。plist文件,看看是否有Main.StoryBoard文件存在
?
?
有:/*****************************************華麗的分割線******************************************/
?
- 1:加載Main.StoryBoard
?
- 2:在StoryBoard上面創建一個UIwindow,
?
- 3:設置Window的根控制器
?
- 4:遍歷控制器上面的所有子控件,沒有則創建對應的控件
?
沒有:/*****************************************華麗的分割線******************************************/
?
- 1:通過一個強引用創建UIWindow
- ? ? self.window = [[UIWindow alloc] init];
?
- 2:設置Window的frame為屏幕的bounds
- ? ? self.window.frame = [UIScreen mainScreen].bounds;
?
- 3:設置window的根控制器
- ? ? self.window.rootViewController = [[UIViewController alloc] init];
?
- 4:將window作為主窗口并且顯示到界面上
- ? ? [self.window makeKeyAndVisible];
這里有一個非常重要但是很少有人去留意的地方,也是作為一個iOS程序員必須知道的,那就是Main函數,我們知道Main函數是一個程序的入口,那么在iOS開發中Main函數有哪些需要注意的地方呢:
- int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
argc、argv:直接傳遞給UIApplicationMain進行相關處理即可
?
principalClassName:指定應用程序類名(app的象征),該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為默認值
?
delegateClassName:指定應用程序的代理類,該類必須遵守UIApplicationDelegate協議
?
?
?
方法:
?
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中兩種常見方式:
- - (void)addSubview:(UIView *)view;
直接將view添加到UIWindow中,但并不會理會view對應的UIViewController
?
- @property(nonatomic,retain) UIViewController *rootViewController;
自動將rootViewController的view添加到UIWindow中,負責管理rootViewController的生命周期
?
常用方法
- - (void)makeKeyWindow;
讓當前UIWindow變成keyWindow(主窗口)
?
- - (void)makeKeyAndVisible;?
讓當前UIWindow變成keyWindow,并顯示出來
?
[UIApplication sharedApplication].windows
在本應用中打開的UIWindow列表,這樣就可以接觸應用中的任何一個UIView對象
(平時輸入文字彈出的鍵盤,就處在一個新的UIWindow中)
?
[UIApplication sharedApplication].keyWindow
用來接收鍵盤以及非觸摸類的消息事件的UIWindow,而且程序中每個時刻只能有一個UIWindow是keyWindow。如果某個UIWindow內部的文本框不能輸入文字,可能是因為這個UIWindow不是keyWindow
?
view.window
獲得某個UIView所在的UIWindow
?
UIWindow還有一個屬性需要注意的,雖然我嗎平時很少用到:
- @property(nonatomic) UIWindowLevel?windowLevel;? ?
對應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)loadView2 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中屬性與方法的詳細解釋:
?
- @interface UIView : UIResponder<NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem>
?
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 YES14 15 16 17 // 控件的一個標記(父控件可以通過tag找到對應的子控件)18 19 @property(nonatomic) NSInteger tag; // default is 020 21 22 23 // 圖層(可以用來設置圓角效果\陰影效果)24 25 @property(nonatomic,readonly,retain) CALayer *layer;26 27 28 29 @end30 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 CGAffineTransformIdentity56 57 58 59 // YES:支持多點觸摸60 61 @property(nonatomic,getter=isMultipleTouchEnabled) BOOL multipleTouchEnabled; // default is NO62 63 @end64 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 // 獲得當前控件所在的window82 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)didMoveToWindow; 150 151 /**系統自動調用**/ 152 153 154 155 // 是不是view的子控件或者子控件的子控件(是否為view的后代) 156 157 - (BOOL)isDescendantOfView:(UIView *)view; // returns YES for self. 158 159 160 161 // 通過tag獲得對應的子控件(也可以或者子控件的子控件) 162 163 - (UIView *)viewWithTag:(NSInteger)tag; // recursive search. includes self 164 165 166 167 /**系統自動調用(留給子類去實現)**/ 168 169 // 控件的frame發生改變的時候就會調用,一般在這里重寫布局子控件的位置和尺寸 170 171 // 重寫了這個寫方法后,一定調用[super layoutSubviews]; 172 173 - (void)layoutSubviews; 174 175 176 177 @end 178 179 180 181 @interface UIView(UIViewRendering) 182 183 // YES : 超出控件邊框范圍的內容都剪掉 184 185 @property(nonatomic) BOOL clipsToBounds; 186 187 188 189 // 背景色 190 191 @property(nonatomic,copy) UIColor *backgroundColor; // default is nil 192 193 194 195 // 透明度(0.0~1.0) 196 197 @property(nonatomic) CGFloat alpha; // default is 1.0 198 199 200 201 // YES:不透明 NO:透明 202 203 @property(nonatomic,getter=isOpaque) BOOL opaque; // default is YES 204 205 206 207 // YES : 隱藏 NO : 顯示 208 209 @property(nonatomic,getter=isHidden) BOOL hidden; 210 211 212 213 // 內容模式 214 215 @property(nonatomic) UIViewContentMode contentMode; // default is UIViewContentModeScaleToFill 216 217 @end 218 219 220 221?
/******************************************************************************
?*? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *
?*? ? ? ? ? ? ? ? ? ? ? ? UIView分類-Block動畫方法? ? ? ? ? ? ? ? ? ? ? ? ? ? *
?*? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *
?*? ? ? ? ? ? ? ? ? ? ? ? ? ? iCocos--Description ? ? ? ? ? ? ? ? ? ? ? ? ? ? *
?*? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *
?******************************************************************************/
?
1 @interface UIView(UIViewAnimationWithBlocks)2 3 + (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;4 5 + (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;6 7 8 9 + (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations; 10 11 + (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay usingSpringWithDamping:(CGFloat)dampingRatio initialSpringVelocity:(CGFloat)velocity options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion; 12 13 @end 14 15 16 17?
?
五:UIApplication,UIWindow,UIViewController,UIView(layer)
?
本博文由博主(iCocos)獨立編寫或者借鑒別人的好文章進行修改而成,如果不對的地方望指正,謝謝! 如果您還有看到新浪博客關于IOS夢工廠的博文,麻煩請到這里找更完整更清晰的版本,博主已從http://blog.sina.com.cn/s/articlelist_3288975567_0_1.html轉移到博客園轉載于:https://www.cnblogs.com/Jenaral/p/5030991.html
總結
以上是生活随笔為你收集整理的UIApplication,UIWindow,UIViewController,UIView(layer)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Android群英传》读书笔记 (5)
- 下一篇: MVC 中 Razor 无限分类的展示