日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UIApplication,UIWindow,UIViewController,UIView(layer)

發(fā)布時間:2024/8/26 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UIApplication,UIWindow,UIViewController,UIView(layer) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載自:http://www.cnblogs.com/iCocos/p/4684749.html

?

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

?

?

一:UIApplication:單例(關(guān)于單例后面的文章中會詳細介紹,你現(xiàn)在只要知道,單例在應(yīng)用程序的整個生命周期中只有一個對象)。

?

App的啟動過程

打開程序之后-》

?

  • 1:Main函數(shù)

?

  • 2:UIapplicationMain函數(shù)

?

  • 3:初始化UIApplication(創(chuàng)建)

?

  • 4:設(shè)置UIApplication代理和相應(yīng)的代理屬性

?

  • 5:開啟事件循環(huán),監(jiān)聽系統(tǒng)事件

?

  • 6監(jiān)測info。plist文件,看看是否有Main.StoryBoard文件存在

?

?

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

?

  • 1:加載Main.StoryBoard

?

  • 2:在StoryBoard上面創(chuàng)建一個UIwindow,

?

  • 3:設(shè)置Window的根控制器

?

  • 4:遍歷控制器上面的所有子控件,沒有則創(chuàng)建對應(yīng)的控件

?

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

?

  • 1:通過一個強引用創(chuàng)建UIWindow
  • ? ? self.window = [[UIWindow alloc] init];

?

  • 2:設(shè)置Window的frame為屏幕的bounds
  • ? ? self.window.frame = [UIScreen mainScreen].bounds;

?

  • 3:設(shè)置window的根控制器
  • ? ? self.window.rootViewController = [[UIViewController alloc] init];

?

  • 4:將window作為主窗口并且顯示到界面上
  • ? ? [self.window makeKeyAndVisible];

這里有一個非常重要但是很少有人去留意的地方,也是作為一個iOS程序員必須知道的,那就是Main函數(shù),我們知道Main函數(shù)是一個程序的入口,那么在iOS開發(fā)中Main函數(shù)有哪些需要注意的地方呢:

  • int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

argc、argv:直接傳遞給UIApplicationMain進行相關(guān)處理即可

?

principalClassName:指定應(yīng)用程序類名(app的象征),該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為默認值

?

delegateClassName:指定應(yīng)用程序的代理類,該類必須遵守UIApplicationDelegate協(xié)議

?

?

?

方法:

?

1 // app啟動完成的時候調(diào)用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即將失去焦點的時候調(diào)用 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 // 保存一些數(shù)據(jù) 34 35 36 37 } 38 39 40 41 // app即將進入前臺的時候調(diào)用 42 43 - (void)applicationWillEnterForeground:(UIApplication *)application { 44 45 NSLog(@"%s",__func__); 46 47 } 48 49 50 51 // app即將獲取焦點的時候 52 53 // 當應(yīng)用程序獲取焦點的時候才能夠與用戶交互 54 55 - (void)applicationDidBecomeActive:(UIApplication *)application { 56 57 NSLog(@"%s",__func__); 58 59 } 60 61 62 63 // app關(guān)閉的時候調(diào)用 64 65 - (void)applicationWillTerminate:(UIApplication *)application { 66 67 68 69 } 70 71 72 73 // 監(jiān)聽內(nèi)存警告 74 75 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 76 77 { 78 79 NSLog(@"內(nèi)存警告"); 80 81 // 清楚圖片緩存 82 83 } 84 85

?

UIApplication單例對象常用功能:

?

? ? // 獲取應(yīng)用程序的象征

?? UIApplication *app =? [UIApplication sharedApplication];

?? ?

? ? // 應(yīng)用程序圖片的提醒數(shù)字:(這里需要注冊)

1 app.applicationIconBadgeNumber = 100;2 3 4 5 // 創(chuàng)建通知對象6 7 UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];8 9 10 11 12 13 // 注冊用戶通知 14 15 [app registerUserNotificationSettings:settings];

?

? ??

? ? // 聯(lián)網(wǎng)狀態(tài)?1?app.networkActivityIndicatorVisible = YES;?

?

?? ?

? ? // 設(shè)置狀態(tài)欄

?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 發(fā)短信 10 11 [app openURL:[NSURL URLWithString:@"sms://10086"]]; 12 13 14 15 發(fā)郵件 16 17 [app openURL:[NSURL URLWithString:@"mailto://12345@qq.com"]]; 18 19 20 21 打開一個網(wǎng)頁資源 22 23 [app openURL:[NSURL URLWithString:@"http://ios.itcast.cn"]]; 24 25

?

二:UIWIndow

?

UIWindow是一種特殊的UIView,通常在一個app中至少會有一個UIWindow

?

iOS程序啟動完畢后,創(chuàng)建的第一個視圖控件就是UIWindow,接著創(chuàng)建控制器的view,最后將控制器的view添加到UIWindow上,于是控制器的view就顯示在屏幕上了

?

一個iOS程序之所以能顯示到屏幕上,完全是因為它有UIWindow

?

也就說,沒有UIWindow,就看不見任何UI界面

?

?

添加UIView到UIWindow中兩種常見方式:

  • - (void)addSubview:(UIView *)view;

直接將view添加到UIWindow中,但并不會理會view對應(yīng)的UIViewController

?

  • @property(nonatomic,retain) UIViewController *rootViewController;

自動將rootViewController的view添加到UIWindow中,負責(zé)管理rootViewController的生命周期

?

常用方法

  • - (void)makeKeyWindow;

讓當前UIWindow變成keyWindow(主窗口)

?

  • - (void)makeKeyAndVisible;?

讓當前UIWindow變成keyWindow,并顯示出來

?

[UIApplication sharedApplication].windows

在本應(yīng)用中打開的UIWindow列表,這樣就可以接觸應(yīng)用中的任何一個UIView對象

(平時輸入文字彈出的鍵盤,就處在一個新的UIWindow中)

?

[UIApplication sharedApplication].keyWindow

用來接收鍵盤以及非觸摸類的消息事件的UIWindow,而且程序中每個時刻只能有一個UIWindow是keyWindow。如果某個UIWindow內(nèi)部的文本框不能輸入文字,可能是因為這個UIWindow不是keyWindow

?

view.window

獲得某個UIView所在的UIWindow

?

UIWindow還有一個屬性需要注意的,雖然我嗎平時很少用到:

  • @property(nonatomic) UIWindowLevel?windowLevel;? ?

對應(yīng)de屬性值:

  • UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal;
  • UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert;
  • UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar;
  • ?

    三:UIViewController

    控制器的創(chuàng)建?

    ?

    ? 了解UIStoryboard對象,通過這個對象,就能加載storyboard文件 注意:必須要有storyboard,創(chuàng)建UIStoryboard對象才有意義,alloc init創(chuàng) 建UIStoryboard對象沒有意義
    1.1> instantiateInitialViewController:默認加載箭頭指向的控制器?

    1.2> instantiateViewControllerWithIdentifier:根據(jù)標識在storyboard查找 控制器,并且創(chuàng)建。?

    ○ 標識不能亂傳,會報錯的,必須storyboard有這個標識才行

    通過xib創(chuàng)建控制器的view(空項目) ? 首先得要有xib。?

    1 xib注意點:(演示沒有的后果)
    1> xib里面必須有一個view描述控制器的view,因為控制器的view 屬性必須有值。
    2> xib需要指定描述哪一個控制器,描述UIView不需要,因為xib里 面可以描述很多UIView,不能固定死,但是控制器就不一樣了,一個 xib就用來描述一個控制器。
    ?xib里面可能有很多view,需要拖線指明哪個是控制器的view?

    2 xib和storyboard的區(qū)別 storyboard已經(jīng)指定了控制器的view,不需要我們管,xib需要我們 手動管理。?

    UIViewController啟動過程

    // 系統(tǒng)默認的做法:如果指定了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的時候調(diào)用的,蘋果提供這個方法的目的也就是這個,所以我們以后自定義View的時候不要在ViewDidLoad里面實現(xiàn),因為ViewDidLoad的意思是View加載完畢以后調(diào)用,那么這個時候已經(jīng)有一個View了,我們再去創(chuàng)建一個View,雖然可以,但是這不是浪費內(nèi)存嗎。

    ?

    ?

    1 // 1.創(chuàng)建窗口2 3 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];4 5 6 7 // 設(shè)置窗口的顏色8 9 self.window.backgroundColor = [UIColor purpleColor]; 10 11 12 13 // 2.創(chuàng)建根控制器,在設(shè)置窗口的根控制器 14 15 UIViewController *vc = [[UIViewController alloc] init]; 16 17 18 19 // 設(shè)置窗口的根控制器,底層會自動把根控制器的view添加到窗口上,并且讓控制器的view有旋轉(zhuǎn)功能 20 21 self.window.rootViewController = vc; 22 23 24 25 // 3.顯示窗口 26 27 // makeKeyAndVisible:讓窗口成為應(yīng)用程序的主窗口,并且顯示窗口 28 29 [self.window makeKeyAndVisible]; 30 31 32 33 return YES; 34 35

    ?

    ?

    生命周期:

    ?

    ?

    ?

    ?

    四:UIView(Layer)

    ?控制器的view的創(chuàng)建?

    1> loadView作用:一般用來創(chuàng)建自定義的view?

    2> loadView什么時候調(diào)用:當控制器的view沒有創(chuàng)建的時候,就會調(diào)用loadView 去創(chuàng)建控制器的view.?

    3> loadView使用注意:如果重寫loadView里面沒有創(chuàng)建控制器的view,就不能使 用self.view,會造成死循環(huán)。?

    注意:

    重寫loadView,不是不會加載xib了嗎,控制器的view由loadView決定, loadView顯示什么顏色,就是什么顏色。
    loadView只是創(chuàng)建控制器View,并不能決定控制器的view的顏色。
    理解loadView的調(diào)用時刻:第一次調(diào)用self.view,底層會調(diào)用LoadView 方法,創(chuàng)建控制器的view,這時候的view是LoadView的顏色,但是?

    vc.view.backgroundColor,是拿到控制器的view又設(shè)置一次顏色,把 LoadView設(shè)置的顏色給覆蓋了。
    在viewDidLoad也設(shè)置顏色,還是vc.view.backgroundColor決定,因為?

    vc.view view, view?

    ?

    loadView只是創(chuàng)建控制器View,并不能決定控制器的view的顏色。?

    vc.view.backgroundColor,是拿到控制器的view又設(shè)置一次顏色,把 LoadView設(shè)置的顏色給覆蓋了。
    ?在viewDidLoad也設(shè)置顏色,還是vc.view.backgroundColor決定,因為 vc.view就是獲取控制器的view,只有控制器的view加載完成之后,才能獲取 到,因此先調(diào)用viewDidLoad。

    理解loadView的調(diào)用時刻:第一次調(diào)用self.view,底層會調(diào)用LoadView 方法,創(chuàng)建控制器的view,這時候的view是LoadView的顏色,但是

    ?

    還有一個概念值得注意的,那就是Layer那么Layer事什么東西呢,他有什么用?他喝UIView又是什么關(guān)系?

    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找到對應(yīng)的子控件)18 19 @property(nonatomic) NSInteger tag; // default is 020 21 22 23 // 圖層(可以用來設(shè)置圓角效果\陰影效果)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 // 形變屬性(平移\縮放\旋轉(zhuǎn))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數(shù)組的后面, 新添加的控件默認都顯示在最上面\最頂部)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數(shù)組中index這個位置)94 95 - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;96 97 98 99 // 交換subviews數(shù)組中所存放子控件的位置 100 101 - (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2; 102 103 104 105 // 添加一個子控件(新添加的控件默認都在subviews數(shù)組的后面, 新添加的控件默認都顯示在最上面\最頂部) 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 /**系統(tǒng)自動調(diào)用(留給子類去實現(xiàn))**/ 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 /**系統(tǒng)自動調(diào)用**/ 152 153 154 155 // 是不是view的子控件或者子控件的子控件(是否為view的后代) 156 157 - (BOOL)isDescendantOfView:(UIView *)view; // returns YES for self. 158 159 160 161 // 通過tag獲得對應(yīng)的子控件(也可以或者子控件的子控件) 162 163 - (UIView *)viewWithTag:(NSInteger)tag; // recursive search. includes self 164 165 166 167 /**系統(tǒng)自動調(diào)用(留給子類去實現(xiàn))**/ 168 169 // 控件的frame發(fā)生改變的時候就會調(diào)用,一般在這里重寫布局子控件的位置和尺寸 170 171 // 重寫了這個寫方法后,一定調(diào)用[super layoutSubviews]; 172 173 - (void)layoutSubviews; 174 175 176 177 @end 178 179 180 181 @interface UIView(UIViewRendering) 182 183 // YES : 超出控件邊框范圍的內(nèi)容都剪掉 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 // 內(nèi)容模式 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)獨立編寫或者借鑒別人的好文章進行修改而成,如果不對的地方望指正,謝謝! 如果您還有看到新浪博客關(guān)于IOS夢工廠的博文,麻煩請到這里找更完整更清晰的版本,博主已從http://blog.sina.com.cn/s/articlelist_3288975567_0_1.html轉(zhuǎn)移到博客園

    轉(zhuǎn)載于:https://www.cnblogs.com/Jenaral/p/5030991.html

    總結(jié)

    以上是生活随笔為你收集整理的UIApplication,UIWindow,UIViewController,UIView(layer)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。