UIKit中的幾個核心對象的介紹:UIApplication,UIWindow,UIViewController,UIView(layer)簡單介紹

UIApplication,UIWindow,UIViewController,UIView(layer)簡單介紹javascript

 

 

一:UIApplication:單例(關於單例後面的文章中會詳細介紹,你如今只要知道,單例在應用程序的整個生命週期中只有一個對象)。java

 

App的啓動過程ios

打開程序以後-》程序員

 

  • 1:Main函數

 

  • 2:UIapplicationMain函數

 

  • 3:初始化UIApplication(建立)

 

  • 4:設置UIApplication代理和相應的代理屬性

 

  • 5:開啓事件循環,監聽系統事件

 

  • 6監測info。plist文件,看看是否有Main.StoryBoard文件存在

 

 

有:/*****************************************華麗的分割線******************************************/windows

 

  • 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進行相關處理便可app

 

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屬性值:

  1. UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal;
  2. UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert;
  3. UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar;

 

三: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中屬性與方法的詳細解釋:

 

  • @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 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)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 
複製代碼

 

 

 

複製代碼
 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)

相關文章
相關標籤/搜索