1. iOS學習路線:編程
C語言:數據類型、流程控制、函數、指針、字符串、結構體、枚舉、預處理;設計模式
OC:面向對象、內存管理、分類、協議、Block、KVC/KVO、Foundation框架;網絡
iOS基礎: 多線程
UIKit框架:基礎視圖:UIButton,UILabel,UITextField,UIImageView,UIScrollView等;app
高級視圖:UITableView,UIPickerView, IB的使用等框架
自定義視圖;ide
控制器: UINavigationController, UITabBarController, 自定義視圖控制器函數
觸摸事件工具
手勢oop
鍵盤處理
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機器的鍵盤、顯示器、觸摸板等
爲了方便開發者開發出強大的功能,蘋果提供了各類各樣的框架
4. UIKit框架
UIKit框架中提供了不少可視化的組件元素,咱們利用UIKit框架提供的各類組件對象組合成美觀的UI界面
須要提醒你們不必一次性所有掌握全部控件的使用,也不必掌握某個控件的全部用法。iOS控件的用法都是類似的,先掌握最主要、最經常使用的控件,其餘控件用時再學
5. 分析界面中的控件
6. 第一個iOS程序
6.1 開發步驟
搭建UI界面,1個按鈕,2個文本框,3個標籤
監聽按鈕的點擊事件
獲取2個文本框的值,將最後結果顯示出來
6.2 建立工程實現
參見01計算器
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)、test@2x.png(200*200)、test@3x.png(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;
}