1. iOS學習路線: C語言:數據類型、流程式控制制、函數、指針、字元串、結構體、枚舉、預處理; OC:面向對象、記憶體管理、分類、協議、Block、KVC/KVO、Foundation框架; iOS基礎: UIKit框架:基礎視圖:UIButton,UILabel,UITextField,UIImag ...
1. iOS學習路線:
C語言:數據類型、流程式控制制、函數、指針、字元串、結構體、枚舉、預處理;
OC:面向對象、記憶體管理、分類、協議、Block、KVC/KVO、Foundation框架;
iOS基礎:
UIKit框架:基礎視圖:UIButton,UILabel,UITextField,UIImageView,UIScrollView等;
高級視圖:UITableView,UIPickerView, IB的使用等
自定義視圖;
控制器: UINavigationController, UITabBarController, 自定義視圖控制器
觸摸事件
手勢
鍵盤處理
MVC模式、代理設計模式
通知機制
iOS高級:
數據存取:plist, 歸檔,SQLite等
多線程編程:GCD, NSOperationQueue, NSThread
網路:NSURLConnection,AFNetworking, CFNetworking
多媒體:音頻、視頻、相機、相冊、流媒體
系統服務:推送、iCloud、內購、廣告、藍牙、打電話、發簡訊、通訊錄,郵件
真機調試,發佈
熱門技術:二維碼、加密、支付、XMPP即時通訊
2.iOS開發一般需要哪些內容
開發人員開發完應用程式後,需要把應用上傳到App Store(蘋果的應用商店),蘋果審核後顯示在商店中,用戶從App Store中下載APP
3. UI
User Interface用戶介面,用戶通過UI和程式交互,提交請求,顯示界面和結果。
可以這樣理解,在iOS程式中,看得見的部分就是UI。類似於我們Mac機器的鍵盤、顯示器、觸摸板等
為了方便開發者開發出強大的功能,蘋果提供了各種各樣的框架
UIKit - 創建和管理應用程式的用戶界面
QuartzCore -提供動畫特效以及通過硬體進行渲染的能力
CoreGraphics -提供2D繪製的基於C的API
CoreLocation -使用GPS和WIFI獲取位置信息
MapKit -為應用程式提供內嵌地圖的介面
AVFoundation – 音頻處理
4. UIKit框架
UIKit框架中提供了很多可視化的組件元素,我們利用UIKit框架提供的各種組件對象組合成美觀的UI界面
需要提醒大家沒必要一次性全部掌握所有控制項的使用,也沒必要掌握某個控制項的所有用法。iOS控制項的用法都是相似的,先掌握最主要、最常用的控制項,其他控制項用時再學
5. 分析界面中的控制項
6. 第一個iOS程式
6.1 開發步驟
搭建UI界面,1個按鈕,2個文本框,3個標簽
監聽按鈕的點擊事件
獲取2個文本框的值,將最後結果顯示出來
6.2 創建工程實現
7. Xcode佈局
7.1 菜單欄
7.2 工具欄:啟動、停止, 顯示與隱藏邊欄
7.3 導航區(Cmd+0):
Project Navigator(Cmd+1),管理當前工程的文件
Symbol Navigator,管理當前工程的類、屬性和方法
Find Navigator,搜索
Issue Navigator, 問題導航
Test Navigator, 測試導航
Debug Navigator, 調試導航,會顯示記憶體、CPU的占用情況
BreakPoint Navigator,顯示所有斷點,能夠快速跳轉到斷點
Report Navigator, 日誌導航,會顯示當前項目的運行、調試等信息
7.4 編輯區
主要操作區域
7.5 實用工具區
7.5.1 對象相關屬性區
選中某個對象後,在該區域顯示當前對象的相關屬性
7.5.2 庫區
文件模板庫,代碼片段庫,對象庫和媒體庫
7.6 調試區
一般分為變數區和控制台兩個區域
8. 從main函數到AppDelegate
Supporting Files 中有main函數,在main函數中,僅僅是調用了UIApplicationMain函數.
UIApplicationMain 前兩個參數為main函數的參數(可以通過edit Schema,設置main的參數);
第三個參數指定當前應用程式的類名,如果為nil,當前項目會創建一個UIApplication類的對象,也可以傳遞一個UIApplication子類,當前main函數就是根據第三個參數創建應用程式;一個UIApplication對象就代表一個應用程式;一個iOS程式啟動後創建的第一個對象就是UIApplication對象;UIApplication對象是一個單例對象,可以通過[UIApplication sharedApplication]來獲得當前應用程式;UIApplication的一個主要工作就是處理用戶事件,它會是一個隊列,對用戶的操作逐個處理;UIApplication還維護一個在當前應用中打開的Window列表;UIApplication一般會被賦予一個代理對象(第4個參數),以處理應用程式生命周期事件,如程式的啟動、關閉、進入後臺、進入前臺等。
第四個參數為當前應用程式的代理類,main函數根據當前代理類創建一個delegate對象,並將該delegate對象賦值給UIApplication對象的delegate屬性。該代理類是一個遵從UIApplicationDelegate 應用程式代理協議的類,當應用發生一些系統級的事件時就會通知代理進行處理。如當來電或鎖屏時會導致APP進入後臺或終止,在APP受到類似干擾時,會產生一些系統事件,這時UIApplication會通知它的delegate對象,讓代理來處理這些系統事件。
// 當應用程式啟動完畢後系統會自動調用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
return YES;
}
// 當來電話或簡訊,或者用戶退出應用程式時,應用從活動狀態轉入非活動狀態時調用,在該方法中暫停正在執行的任務,使時鐘無效,或暫停游戲
- (void)applicationWillResignActive:(UIApplication *)application {
}
// 當應用進入後臺時調用,可以在該方法中保存用戶數據,釋放占用的資源,作廢時鐘,保存足夠的程式狀態以便應用重啟時能夠恢復到當前狀態。需要註意的是當用戶退出時,會調用這個方法,而不是applicationWillTerminate:方法
- (void)applicationDidEnterBackground:(UIApplication *)application {
}
// 當應用從後臺即將變為前臺時調用,一般在該方法中恢復應用進入後臺時保存的狀態
- (void)applicationWillEnterForeground:(UIApplication *)application {
}
// 當應用變為活動狀態時調用,在該方法中啟動在不活動狀態中暫停的任務,如果應用之前已經進入後臺,可能需要刷新用戶界面
- (void)applicationDidBecomeActive:(UIApplication *)application {
}
// 當結束應用程式時調用該方法,如果合適可以保存數據,如果程式已經進入後臺後,該方法不會再被調用。可以設置Info.plist文件,修改Application does not run in background屬性設置為Yes後,程式將不再進入後臺運行
- (void)applicationWillTerminate:(UIApplication *)application {
}
// 可選方法,當系統記憶體緊張時,嘗試釋放當前應用的一些記憶體,如果記憶體還不足,應用則終止
-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application{
}
9.程式的啟動過程
在main函數中調用UIApplicationMain函數;
創建UIApplication對象,創建UIApplication的delegate對象;
開啟一個事件迴圈(Main Runloop)監聽系統級的事件;
如果沒有storyboard故事板,程式啟動完畢後就會調用AppDelegate中的- (BOOL)application: didFinishLaunchingWithOptions: 方法,在該方法中創建UIWindow對象,創建和設置UIWindow的rootViewController根視圖控制器,顯示視窗;參考代碼:
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
ViewController *vc = [[ViewController alloc]init];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
如果有storyboard故事板的話,會根據Info.plist獲得Main.storyboard,載入該故事板,創建UIWindow,設置UIWindow的rootViewController根視圖控制器,顯示視窗。
10 工程文件
AppDelegate.h和AppDelegate.m文件,應用的代理文件;
ViewController.h和ViewController.m文件,視圖控制器,主要在視圖控制器中編寫邏輯代碼;
Main.storyboard故事板,預設程式的啟動界面,可以在該視圖中添加控制項,預設情況下,該視圖的控制器為ViewController;預設啟動Main.storyboard故事板,可以在Info.plist文件中重新設置主故事板的名稱。在Main.storyboard中的View Controller(視圖控制器)的左側有一個箭頭,表示該控制器是Initial View Controller。
Assets.xcassets是一個圖片文件夾,用來存儲項目圖片,綠色文件夾表示真實存在的文件夾,黃色文件夾表示邏輯文件夾,便於在當前項目中管理相應的文件,不是真實存在的;
LaunchScreen.storyboard,是程式啟動完成前的一個載入界面;
Info.plist是當前項目的相關信息;
Supporting Files邏輯文件夾,main函數在該文件夾中;
Products文件夾,保存生成的app
11 創建空工程
應用也可以不從Main.storyboard啟動。可以刪除掉Main.storyboard故事板,選中工程,在General選項卡中找到Main Interface列表框,刪除Main。
打開AppDelegate.m文件,在文件頂部導入頭文件
#import "ViewController.h”,
修改- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
ViewController *vc = [[ViewController alloc]init];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
return YES;
}
12. 設置控制項的屬性
12.1 直接在Attributes Inspector面板中設置
12.2在代碼中設置
設置字體:lbl.font = [UIFont boldSystemFontOfSize:24];
NSLog(@"%@", [UIFont familyNames]);在控制臺中輸出支持的所有字體
設置文本顏色: lbl.textColor = [UIColor redColor];
設置文本的對齊方式: lbl.textAlignment = NSTextAlignmentRight;
字體自適應標簽的寬度: lbl.adjustsFontSizeToFitWidth = YES; 需要註意的是不能自適應高度
UILabel的換行,先設置最多顯示的行數: lbl.numberOfLines = 3;
如果文字不夠,實際上是幾行就是幾行;如果行高不夠,能顯示幾行就是幾行;如果行數設置為0,表示沒有行數限制。
然後設置換行中斷模式:lbl.lineBreakMode = NSLineBreakByWordWrapping;
需要註意的是,在新版本的iOS中,ByWordWrapping、ByCharWrapping和ByClipping效果可能是一樣的,顯示不完全時,截斷後面的字元;
設置tag標記,是一個正整數: lbl.tag = 123;可以通過tag標記快速訪問控制項如: (UILabel *) [self.view viewWithTag:123],
設置陰影的顏色和偏移: lbl.shadowColor = [UIColor yellowColor];
lbl.shadowOffset = CGSizeMake(2, 2);
設置透明度: lbl.alpha = 0.8;
13 現有iOS設備的坐標系
13.1 iPhone設備的大小
普通屏1點==1像素,Retina屏,1點==2像素,6+ ,1點==3像素
4s: 3.5寸, 320*480點, 640*960像素
5s: 4寸, 320*568點, 640*1136像素
6 : 4.7寸, 375*667點, 750*1334像素
6+: 5.5寸, 414*736點, 1242*2208像素,蘋果會自動縮放到1080*2208像素
在準備APP所需要的圖片時,需要準備三張相同的圖,如:test.png(100*100)、[email protected](200*200)、[email protected](300*300),系統會根據當前設備自動選擇相應的圖片
13.2 frame和bounds
(1). frame 與 bounds的區別
-(CGRect)frame{
return CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height);
}
-(CGRect)bounds{
return CGRectMake(0,0, self.frame.size.width,self.frame.size.height);
}
bounds的原點是(0,0)點(就是view本身的坐標系統,預設永遠都是0,0點),而frame的原點卻是任意的(相對於父視圖中的坐標位置)。
frame: 該view在父view坐標系統中的位置和大小。(參照點是父view的坐標系統)
bounds:該view在本地坐標系統中的位置和大小。(參照點是本地坐標系統,就相當於ViewB自己的坐標系統,以0,0點為起點)
center:該view的中心點在父view坐標系統中的位置和大小。(參照電是父視圖的坐標系統)
每個view都有一個本地坐標系統。這個坐標系統作用比較重要,比如觸摸的回調函數中的UITouch裡面的>坐標值都是參照這個本地坐標系統的坐標。當然bounds這個屬性也是參照這個本地坐標系統來的。其實本地坐標系統的關鍵就是要知道的它的原點(0,0)在什麼位置(這個位置又是相對於上層的view的本地坐標系統而言的,當然最上面的一層view就是 window它的本地坐標系統原點就是屏幕的左上角了)。通過修改view的bounds屬性可以修改本地坐標系統的原點位置。
例:
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 280, 250)];
[view1 setBounds:CGRectMake(-20, -20, 280, 250)];
//設置了bounds後,view1左上角的坐標相當於原點的位置是-20,-20
view1.backgroundColor = [UIColor redColor];
[self.view addSubview:view1];//添加到self.view
NSLog(@"view1 frame:%@========view1 bounds:%@",NSStringFromCGRect(view1.frame),NSStringFromCGRect(view1.bounds));
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
view2.backgroundColor = [UIColor yellowColor];
[view1 addSubview:view2];//添加到view1上,[此時view1坐標系左上角起點為(-20,-20)]
NSLog(@"view2 frame:%@========view2 bounds:%@",NSStringFromCGRect(view2.frame),NSStringFromCGRect(view2.bounds));
13.3 給控制項重新設置大小及位置
CGRect newFrame = CGRectMake(100, 200, 200, 50);
lbl.frame = newFrame;
不能這樣直接設置
lbl.frame.origin.x = 200; //error
14. UIButton
按鈕,可以對應用的點擊作出響應。繼承自UIControl,間接繼承自UIView。
14.1 通過滑鼠從對象庫中把按鈕拖曳到視圖中
14.2 通過代碼添加
UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 100, 40)];
btn.backgroundColor = [UIColor cyanColor];
[btn setTitle:@"button" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[self.view addSubview:btn];
上面代碼實現了設置背景色、設置標題、設置標題顏色.
這兒用到一個狀態,按鈕常用 的狀態包括正常狀態、高亮狀態、選中狀態和禁用狀態。如果沒有設置高亮狀態的標題,預設和正常狀態標題一樣。
設置按鈕的選中狀態:btn.selected = YES;
設置禁用狀態:btn.enabled = NO;
設置字體: btn.titleLabel.font = [UIFont boldSystemFontOfSize:28];
設置圖片:[btn setImage:[UIImage imageNamed:@"navigationbar_arrow_up"] forState:UIControlStateNormal]; 如果圖片較小,預設情況下圖片在左側,文字在右側。
設置按鈕的背景圖片:[btn setBackgroundImage:[UIImage imageNamed:@"navigationbar_arrow_up"] forState:UIControlStateNormal];
14.3 系統預設樣式按鈕
UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
btn.frame = CGRectMake(100, 100, 200, 200);
btn.backgroundColor = [UIColor redColor];
btn.center = CGPointMake(100, 100);
現在很多系統樣式按鈕已經失效,不建議使用系統button
14.4 添加事件
14.4.1 在故事板中,通過滑鼠拖曳添加動作
14.4.2 通過代碼添加
[btn addTarget:self action:@selector(buttonClicked ) forControlEvents:UIControlEventTouchUpInside];
第一個參數是接收事件的對象;第二個參數是接收到事件後需要進行的動作;第三個參數是接收什麼類型的事件。當運行APP後,單擊這個按鈕,就會觸發UIControlEventTouchUpInside事件,系統收到該事件後,就會交給當前對象self(ViewController視圖控制器)響應這個事件,然後會跳轉到buttonClicked方法中執行。
在ViewDidLoad方法的下麵添加一個方法:
-(void)buttonClicked{
self.view.backgroundColor = [UIColor lightGrayColor];
}
14.4.3 帶參數的事件響應程式
(1). 添加動作時,可以指定參數,一般是當前按鈕本身
(2). 在添加事件時,可以在響應消息後添加一個冒號,如:
[btn addTarget:self action:@selector(buttonClicked: ) forControlEvents:UIControlEventTouchUpInside];
相應的響應方法修改為:
- (void)buttonClicked:(UIButton *)button{
self.view.backgroundColor = [UIColor lightGrayColor];
// 在方法中可以通過button來訪問當前響應事件的按鈕
[button setTitle:@"被點了" forState:UIControlStateNormal];
}
15. 時鐘NSTimer
15.1 創建NSTimer對象
Timer可以等待一定的時間間隔,然後給目標對象發送一條指定的消息。如創建一個時鐘對象,給window發送一條消息,告訴window在指定間隔後更新。
NSTimer和run loops運行迴圈一起工作。
/**
* 創建一個時鐘對象,該對象會立即加入到運行迴圈中
*
* 第一個參數是時間間隔
* 第二個參數響應對象
* 第三個參數是響應方法
* 第四個參數是傳遞用戶信息
* 第五個參數是否允許每隔指定的時間間隔就發送一次消息
*
* @return 返回一個時鐘對象
*/
NSTimer _timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(moveLabel) userInfo:nil repeats:YES];
也可以先創建時鐘,再手動把時鐘添加到運行迴圈中,如:
NSTimer _timer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(moveLabel) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
15.2 實例
(1). 創建一個SingleView Application
(2). 在ViewController的類擴展中添加一個NSTimer成員變數
@interface ViewController (){
NSTimer *_timer; // 聲明一個成員變數
}
@end
(3). 在viewDidLoad方法中,創建一個按鈕,創建一個標簽,初始化NSTimer成員變數
- (void)viewDidLoad {
[super viewDidLoad];
// 創建一個按鈕
[self createButton];
// 創建一個標簽
[self createLabel];
// _timer成員變數初始化
_timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(moveLabel) userInfo:nil repeats:YES];
}
(4). 編寫代碼創建一個按鈕
- (void)createButton{
UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(50, 50, 200, 30)];
btn.backgroundColor = [UIColor redColor];
[btn setTitle: @"點我啟動或停止" forState:UIControlStateNormal];
[btn addTarget:self action: @selector(startOrStop) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
}
編寫代碼,完善點擊按鈕的響應程式
- (void)startOrStop{
static BOOL isRunning = YES;
if (isRunning ) {
[_timer setFireDate:[NSDate distantFuture]];
isRunning = NO;
}else{
[_timer setFireDate:[NSDate distantPast]];
isRunning = YES;
}
}
(5). 創建一個標簽
- (void)createLabel{
UILabel *lbl = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 50, 30)];
lbl.backgroundColor = [UIColor redColor];
lbl.textColor = [UIColor blueColor];
lbl.text = @"我是標簽";
lbl.tag = 123;
[self.view addSubview:lbl];
}
(6). 編寫代碼,完善定時器的響應方法
- (void)moveLabel{
static int xOffset = 5, yOffset = 5 ;
UILabel *lbl = (UILabel *) [self.view viewWithTag:123];
CGRect frame = lbl.frame;
frame.origin.x += xOffset;
frame.origin.y += yOffset;
CGFloat width = self.view.bounds.size.width;
CGFloat height = self.view.bounds.size.height;
if (frame.origin.x >= width || frame.origin.x < 0) {
xOffset *= -1;
}
if (frame.origin.y >= height || frame.origin.y < 0 ) {
yOffset *= -1;
}
lbl.frame = frame;
}
【註】實踐是檢驗真理的唯一標準!最好應用純代碼敲一遍