【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,新增到視窗)