iOS開發系列課程(01) --- iOS程式設計入門
iOS概述
什麼是iOS
iOS是蘋果公司為它的移動裝置(iPhone、iPad、iWatch等)開發的移動作業系統。
iOS發展史
- 2007年蘋果釋出iPhone Runs OS X
- 2008年更名iPhone OS
- 2010年更名iOS
- 2012年WWCD 2012上釋出iOS 6
- 2013年WWCD 2013上釋出iOS 7
- 2014年WWCD 2014上釋出iOS 8和Swift
- 2015年WWCD 2015上釋出iOS 9和Watch OS
Cocoa Touch框架
iOS系統架構可以分為如下圖所示的4層,Cocoa Touch框架的地位不言而喻。
說明:Core OS和Core Service提供了底層支援,包括檔案訪問、網路協議、低階資料型別等。Media提供了基本繪圖和音視訊的支援,包括OpenGL、Quartz、Core Audio和Core Animation等。Cocoa Touch包括了開發使用的大部分API,主要由Foundation(檔案訪問、網路操作、資料和容器型別)和UIKit(UI控制元件、控制器等)兩個部分構成。在進行App開發時,應該由上到下使用這些技術層次,越上層的API封裝得越好,開發越方便,但能自己發揮的東西越少。
應用和使用者介面
使用者介面(也叫使用者介面)就是人和計算機交流的渠道,人把要做的事情告訴計算機,而計算機把處理的結果呈現出來。使用者介面以計算機的I/O裝置作為基礎。
應用程式是指為完成某項或多項特定工作的計算機程式,它執行在使用者模式,可以和使用者進行互動,具有可視的使用者介面。手機上的應用通常稱之為App。
幾個相關術語:
- UI: User Interface (使用者介面/介面)
- App: Application (應用程式)
- API:Application Programming Interface (應用程式程式設計介面)
UIKit繼承結構
實現App開發中的使用者介面首先要從UIResponder及其子類開始研究,當然整個過程會覆蓋整個UIKit框架,比如UIColor(顏色)、UIEvent(事件)、UIFont(字型)、UIGestureRecognizer(手勢識別)、UIImage(影象)、UIScreen(螢幕)等諸多內容。
iOS開發入門
在Xcode中建立iOS專案
啟動Xcode在歡迎頁中選擇"Create a new Xcode project"。在專案建立嚮導中選擇iOS->Application->Single View Application然後點選下一步。接下來需要設定專案名稱、組織名稱、組織標識、開發語言(OC或Swift)和裝置(iPhone、iPad或Universal)。下一步之後選擇專案的位置就可以點選"Create"完成專案建立了。
說明:選擇應用的型別其實是選擇一個專案模板,讓Xcode幫你完成一些繁瑣的工作,如果使用Xcode 5,我們建議初學者選擇Empty Application,從零開始做一個專案更有助於我們理解程式碼的工作原理,真正做開發的時候可以選擇寫程式碼或者使用視覺化的設計器(storyboard或xib),看你所在的公司有怎樣的要求。
熟悉Xcode
Xcode的上方是工具欄,有很多工具按鈕。
Xcode的左側是導航區域,包括:專案導航、符號導航、查詢導航、問題導航、測試導航、除錯導航、斷點導航、報告導航
提示:可以使用Command+1-8的數字鍵在8種導航之間切換。
Xcode的中間是編輯器區域;中間的下面是除錯區域。
Xcode的右側上方是檢查器(審查)區域;右側下方是各種庫的區域。
Xcode常用功能和快捷鍵
- Command+[ -> 程式碼塊左移
- Comamnd+] -> 程式碼塊右移
- Tab -> 接受程式碼自動完成提示
- Esc -> 顯示程式碼提示
- Command+B -> 編譯
- Command+R -> 執行
- Control+F -> 前移游標
- Control+B -> 後移游標
- Control+P -> 游標移到上一行
- Control+N -> 游標移到下一行
- Control+A -> 游標移到行首
- Control+E -> 游標移到行尾
- Control+T -> 交換游標左右字元
- Control+D -> 刪除游標右邊的字元
- Control+K -> 刪除本行
- Control+L -> 將游標所在位置置於視窗中央
- 按住Option雙擊滑鼠 -> 搜尋文件
- Command+Y -> 啟用/禁用斷電
- Command+Control+Y -> 繼續執行
- F6 -> 單步跳過
- F7 -> 單步跳入
- F8 -> 跳出
第一個iOS應用
可以在專案導航中看到整個專案包含的檔案,開啟Supporting Files資料夾可以看到一個main.m檔案,裡面有大家非常熟悉的main函式。C和Objective-C(以後簡稱OC)程式的入口都是main函式,iOS應用的入口當然也是main函式,只不過main函式風騷的打了醬油,僅僅去呼叫了一個叫做UIApplicationMain的函式。UIApplicationMain函式會建立一個UIApplication的物件。每個iOS應用都有且僅有一個UIApplication物件,該物件的作用是維護一個訊息迴圈,監聽應用程式的各種事件並執行相應地回撥方法(callback method)。回撥是一種常見的程式設計模式,當我們知道一件事情發生的時候要做什麼,但是並不知道這件事情什麼時候會發生就會用到回撥的程式設計模式,註冊一系列的回撥方法,當事件發生時通過委託的物件呼叫這些方法。
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
說明:UIApplicationMain方法的四個引數,其中前兩個是main方法的命令列引數,第三個引數表是UIApplication類或其子類的名字,UIApplication物件會啟動一個事件監聽的迴圈監聽各種事件,然後通過委託的方式處理這些事件,而第四個引數正好是一個應用程式委託類的名字。
AppDelegate類的程式碼如下所示:
標頭檔案
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
原始檔
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 應用程式載入完成
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
// 應用即將置於後臺
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
// 應用已經置於後臺
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
// 應用即將置於前臺
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
// 應用已經進入前臺
}
- (void)applicationWillTerminate:(UIApplication *)application {
// 應用即將終止
}
@end
也就是說,我們整個應用程式的執行流程和生命週期應該是下面這組圖所示的情況。
應用程式載入到前臺:
應用程式載入到後臺:
應用程式從前臺進入後臺:
應用程式從後臺進入前臺:
iOS座標體系
螢幕左上角是座標原點,橫向是X軸的正向,縱向是Y軸的正向,狀態列從Y=0到Y=20處。
螢幕尺寸如下表所示:
裝置 | 螢幕尺寸 | 解析度 | 座標點 |
---|---|---|---|
iPhone 3和3s | 3.5英寸 | 320*480 | 320*480 |
iPhone 4和4s(支援Retina) | 3.5英寸 | 640*960 | 320*480 |
iPhone 5和5s(支援Retina) | 4英寸 | 640*1136 | 320*568 |
iPhone 6 | 4.7英寸 | 750*1334 | 375*667 |
iPhone 6 Plus | 5.5英寸 | 1080*1920 | 414*736 |
iPad 1和2(不支援Retina) | 9.7 | 768*1024 | 768*1024 |
iPad 3和4(支援Retina) | 9.7 | 1536*2048 | 768*1024 |
iPad Air | 9.7 | 1536*2048 | 768*1024 |
iPad Mini(不支援Retina) | 7.9 | 768*1024 | 768*1024 |
iPad Mini2(支援Retina) | 7.9 | 1536*2048 | 768*1024 |
窗體的作用
UIWindow相當於一個畫框。它能夠承載其他的檢視物件(包括檢視的子類物件),但通常情況下我們不會將所有的檢視物件直接放在應用的視窗上,而是由一個或多個檢視控制器物件(稍後介紹)來管理這些內容。
UIView和UIWindow
UIWindow呈現的原理
我們可以在剛才的AppDelegate.m檔案中加入下面的程式碼。
// 應用程式載入完成時回撥此方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 建立視窗物件並設定其大小為螢幕大小
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// 設定視窗的背景色
self.window.backgroundColor = [UIColor whiteColor];
// 設定視窗物件為主視窗並且可見
[self.window makeKeyAndVisible];
return YES;
}
UIWindow和UIView的繼承關係
UIWindow是UIView的子類。UIView定義了一個矩形區域以及操作這個矩形區域中內容的程式設計介面,除此之外UIView還要處理執行時區域中內容的互動行為(繪圖、動畫和事件處理)。從上面的圖中我們也可以看出,我們要使用的控制元件都是UIView的子型別。檢視會按層次結構排列,位於檢視層次結構頂端的就是應用窗體。
任何應用都有且僅有一個UIWindow物件,UIWindow物件就像一個容器,負責包含應用中的所有檢視。應用需要在啟動時建立並設定UIWindow物件,然後為其新增其他的檢視,就像上面的程式碼呈現的那樣。
加入視窗的檢視會成為該視窗的子檢視。子檢視也可以有自己的子檢視從而構成一個以UIWindow作為根的檢視層次結構(樹形結構)。
UIView的基本屬性和方法
- frame屬性:設定檢視的座標和尺寸
- backgroundColor屬性:設定檢視的背景色
- window屬性:檢視所在的視窗物件
- -addSubview方法:新增子檢視
UILabel的使用詳解
UILabel的常用屬性
要想使用iOS程式設計的API,可以下載一個叫做Dash的工具來查閱文件,非常的方便好用,不僅可以看到文件還可以查閱到Google和StackOverflow上的相關問題,你肯定會喜歡上這個工具的。
UILabel的常用屬性:
- text屬性:標籤上的文字
- textColor屬性:文字的顏色
- textAlignment屬性:文字的對齊方式
- font屬性:字型
- adjustsFontSizeToFitWidth屬性:調整文字大小適應標籤寬度
- numberOfLines屬性:顯示的行數,設定成0表示不限制行數
接下來我們為剛才建立的應用程式新增下面的程式碼來放置一個標籤。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor orangeColor];
[self.window makeKeyAndVisible];
// 建立標籤物件
UILabel *myLabel = [[UILabel alloc] init];
// 設定標籤的尺寸和座標
myLabel.frame = CGRectMake(50, 300, 275, 40);
// 設定標籤的字型
myLabel.font = [UIFont systemFontOfSize:36];
// 設定標籤的顏色
myLabel.textColor = [UIColor blueColor];
// 設定標籤的對齊方式
myLabel.textAlignment = NSTextAlignmentCenter;
// 設定標籤上的文字
myLabel.text = @"Hello, world!";
// 將標籤新增到視窗上
[self.window addSubview:myLabel];
return YES;
}
應用在模擬器(iPhone 6)上執行效果如下所示: