1. 程式人生 > >【iOS】第01講 UIView/UIViewController/UIApplication詳解

【iOS】第01講 UIView/UIViewController/UIApplication詳解

一、UIView詳解

Command+Alt+Enter -> 顯示ViewController

按住Ctrl直接把UIView拖到ViewController


 1.1 UIView的常見屬性

 @property(nonatomic,readonly) UIView *superview;

   獲得自己的父控制元件物件

 @property(nonatomic,readonly,copy) NSArray *subviews;

   獲得自己的所有子控制元件物件

 @property(nonatomic) NSInteger tag;

   控制元件的ID,父控制元件可以通過tag來找到對應的字控制元件

 @property(nonatomic) CGAffineTransform transform;

   控制元件的形變屬性(可以設定旋轉角度、比例縮放、平移)

 @property(nonatomic) CGRect frame;

   控制元件矩形框在父控制元件中的位置和尺寸(以父控制元件的左上角為座標原點)

 @property(nonatomic) CGRect bounds;

   控制元件矩形框的位置和尺寸(以自己左上角為座標原點,所以bounds的x,y一般為0)

 @property(nonatomic) CGPoint center;

   控制元件中點的位置(以父控制元件的左上角為座標原點)


二、UIViewController詳解


  2.1 UIViewController

     //當控制器載入完畢時呼叫

      - (void) viewDidLoad;

     //當控制器的view即將顯示的時候呼叫

      - (void) viewWillAppear:(BOOL) animated;

     //當控制器的view顯示完畢時呼叫

      - (void) viewDidAppear:(BOOL) animated;

     //當控制器view將要佈局子控制元件時呼叫

      - (void) viewWillLayoutSubviews;

     //當控制器的view佈局子控制元件完畢時呼叫

      - (void) viewDidLayoutSubviews;

     //當控制器的view即將消失時呼叫

      - (void) viewWillDisapper:(BOOL) animated;

     //當控制器的view消失完畢時呼叫

      - (void) viewDidDisappear;

     //當控制器受到記憶體警告時呼叫

      - (void) didReceiveMemoryWarning;


  2.2 多控制器

      一個iOS的app很少只由一個控制器組成

      當app中有很多個控制器的時候,我們就需要對這些控制器進行管理

      有多個view時,可以用1個大的view去管理一個或多個小view

       控制器也是如此,用1個控制器去管理其他多個控制器


    為了便於管理控制器,iOS提供了2個比較特殊的控制器

    UINavigationController和UITabBarController


   <1> UINavigationController

      view結構

      導航條

      棧頂控制器的view

       


     UINavigationController的簡單使用

         >初始化UINavigationController

         >設定UIWindow的rootViewController為UINavigationController

         >根據具體情況,通過push方法新增對應個數的字控制器


     UINavigationController的子控制器

        >UINavigationController以棧的形式儲存子控制器

        @property(nonatomic,copy) NSArray *viewControllers;

        @property(nonatomic,readonly) NSArray *childViewControllers;


       >使用push方法能將某個控制器壓入棧

        - (void) pushViewController:(UIViewController*):viewController animated:(BOOL)animated;


       >使用pop方法可以移除控制器

        將棧頂的控制器移除

         - (UIViewController*) popViewControllerAnimated:(BOOL)animated;

        回到指定的子控制器

        - (NSArray*) popToViewController:(UIViewController*) viewController animated:(BOOL)animated;

         回到根控制器(棧底控制器)

        - (NSArray*) popToRootViewControllerAnimated:(BOOL)animated;  


      如何修改導航條的內容

      導航條的內容由棧頂控制器的navigationItem屬性決定

      UINavigationItem有以下屬性影響著導航條的內容

       >左上角的返回按鈕

         @property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;

       >中間的標題檢視

         @property(nonatomic,retain) UIView   *titleView;

       >中間的標題文字

         @property(nonatomic,copy) NSString   *title;

       >左上角的檢視

         @property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;

       >右上角的檢視

         @property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;


    <2> UITabBarController

     使用步驟

       > 初始化

       > 設定UIWindow的rootViewController為UITabBarController

       > 根據具體情況,通過addChildViewController方法新增對應個數的子控制器

          新增子控制器的方式有2種:

           > 新增單個子控制

             - (void)addChildViewController:(UIViewController*)childController;

           > 設定子控制器陣列

             @property(nonatomic,copy) NSArray *viewControllers;

      

       view結構

            UITabBarController預設顯示第一個子控制器

            


三、程式框架原理及工程檔案概念


  3.1 LaunchScreen檔案

    用來設定啟動頁面,如果不設定,預設它的螢幕大小是4s的尺寸

    

      也可以不從LaunchScreen.storyboard載入啟動圖

       把啟動圖新增到LaunchImage裡的

     

       指定LaunchImage 啟動圖裡的各個尺寸

              

  3.2 info.plist檔案

        設定app的配置資訊,它是一個字典

        Bundle name : 應用程式的名稱

        Bundle identifier : 應用程式的唯一標識

        Bundle versions string,short : 版本號

        Bundle version : 應用程式打包版本號


  3.3 PCH檔案

      首先在工程新建一個PCH檔案

      然後 在Build Settings 下

      設定 Apple LLVM - Language 的 Precompile Prefix Header 和 Prefix Header

     

       a.存放一些公有的巨集

           #define ScreenW [UIScreen mainScreen].bounds.size.width

       b.匯入公用的標頭檔案

           #import "UIView+frame.h"

       c.自定義log

         #ifdef DEBUG

            #define LOG(...) NSLog(__VA_ARGS_)

         #else

            #define LOG(...)

         #endif


  3.4 UIApplication

      每一個應用都有自己的UIApplication ,而且是單例的

      通過[UIApplication sharedApplication] 可以獲得這個單例物件

      一個iOS程式啟動後建立的第一個物件就是UIApplication物件

      > 設定應用程式圖示右上角的紅色提醒數字

         iOS 8之後需要先註冊使用者通知

         @property(nonatomic) NSInteger applicationIconBadgeNumber;

    UIApplication *app = [UIApplicationsharedApplication];

    

    UIUserNotificationSettings *notice = [UIUserNotificationSettings         settingsForTypes:UIUserNotificationTypeBadgecategories:nil];

    [app registerUserNotificationSettings:notice];

    

    app.applicationIconBadgeNumber =1;


      > 設定聯網指示器的可見性

         @property(nonatomic,getter=isNetworkActivityIndicatorVisible)

               BOOL networkActivityIndicatorVisible;


      > 設定狀態列

          從iOS7開始,系統提供了2種管理狀態列的方式

             > 通過UIViewController管理(每一個UIViewController都可以擁有自己不同的狀態列)

             > 通過UIApplication管理 (一個應用程式的狀態列由它統一管理)

          在iOS7中,預設情況下,狀態列都是由UIViewController管理的

          UIViewController實現下列方法就可以輕鬆管理狀態列的可見性和樣式

              > 狀態列的樣式

                - (UIStatusBarStyle)preferredStatusBarStyle;

              > 狀態列的可見性

                - (BOOL)preferredStatusBarHidden;

          設定通過UIApplication管理狀態列,需要在Info.plist中新增 設定為NO

          


    app.statusBarHidden =YES;

    app.statusBarStyle =UIStatusBarStyleLightContent;


      > 開啟網頁openURL

         - (BOOL)openURL:(NSURL*)url;

         >打電話

           [app openURL:[NSURL URLWithString:@"tel://10086"]];

         >發簡訊

           [app openURL:[NSURL URLWithString:@"sms://10086"]];

         >發郵件

           [app openURL:[NSURL URLWithString:@"mailto:[email protected]"]];

         >開啟一個網頁資源

           [app openURL:[NSURL URLWithString:@"http://www.baidu.com"]];


      > UIApplication和delegate

        所有的移動作業系統都有個致命的缺點:

           app很容易受到打擾。比如一個來電或者鎖屏會導致app進入後臺甚至被終止。

        在app受到干擾時,會產生一些系統事件,

           這時UIApplication會通知它的delegate物件,讓delegate代理來處理這些系統事件

         delegate可處理的事件包括:

           > 應用程式的生命週期事件(如程式啟動,關閉)

           > 系統事件 (如來電)

           > 記憶體警告

      

                    

               

  3.5 UIWindow

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


     iOS程式啟動完畢後,建立的第一個檢視控制元件就是UIWindow,接著建立控制器的view

     最後將控制器的view新增到UIWindow上,於是控制器的view就顯示在螢幕上了


     視窗建立流程:

       1> 如果Info.plist中的Main storyboard file base name 設定為 Main

            它會載入Main.storyboard,如果為空,不載入Main.storyboard

       2> 先建立一個視窗UIWindow

       3> 把Main.storyboard箭頭指向的控制器,設為根控制器

       4> 顯示視窗(把控制器的view,新增到視窗)