本文面向已有其它語言(如Java,C,PHP,Javascript)編程經驗的iOS開發初學者,初衷在於讓個人同事一小時內瞭解如何開始開發iOS App,學習目標包括:php
本文不包含任何高級的iOS開發知識,已學會iOS開發的同窗不要看,看完這篇文章學會了的同窗也不用再看了。html
有過腳本開發經驗的人(如Javascript,PHP,Shell)在剛開始學習iOS開發的時候,會以爲iOS開發的學習曲線比腳本語言要高,是的,這種感受是對的。由於學iOS開發,不只是學習一門新語言,它包括:java
初學腳本語言一般不會來繪製圖形界面、與人交互,iOS若是不作圖形界面,像腳本語言同樣處理文本操做數據庫,就沒啥意思了。linux
因此,過去我寫別的新手入門教程,一般都是寫《XXX入門15分鐘教程》,而iOS就要花數倍的時間來寫了。ios
作iOS開發必定要有蘋果的軟件環境:Mac OS操做系統、Objective-C編譯器、設備模擬器等,開發工具倒不必定要用Xcode,只要是個源代碼編輯工具就行(vim都行,只是沒Xcode那麼多功能)。git
擁有Mac OS環境最簡單的方法是找一臺蘋果電腦,包括iMac, MacBook Pro, MacBook Air, Mac Mini,但不包括蘋果的移動設備(iPod Touch, iPhone, iPad, iPad Mini,它們運行的是iOS系統,不是Mac OS),蘋果電腦在出廠的時候就會預裝Mac OS,目前最新版本是Mac OS X 10.8,主流的版本還有Mac OS X 10.六、Max OS X 10.7。程序員
若是囊中羞澀,能夠借一臺,或者上淘寶買個二手的。github
提到iOS開發入門,彷佛沒辦法不說黑蘋果。所謂黑蘋果,就是把Mac OS改造後安裝在非蘋果的硬件上,這是違反DMCA法案的,黑蘋果的更多資料,能夠在維基上找到web
蘋果電腦價格高,國內軟件開發者生存壓力大,因此黑蘋果在國內也有一些真實的存在,國外固然也有啦。objective-c
黑蘋果基本能夠勝任iOS開發,但有一些問題:
上面這些雖然不會直接影響Xcode寫代碼、模擬器測試,但寫着寫着想上網查個東西的時候,safari不能翻頁,確實挺影響心情的。因此,錢包容許的前提下,仍是搞個蘋果電腦省心一些。
Xcode能夠在蘋果官網免費下載:Xcode下載地址
安裝Xcode時會自動安裝iOS SDK和模擬器。
這麼強大的IDE竟然是免費的,仍是挺讓人開心的。
學一門新軟件開發技能,可以第一時間作出一個可運行的產品很是重要,有助於給本身正面激勵,我上大學的時候,有不少次想學一門新語言,每每花了半個月,還沉浸在數據類型和語法字典裏,連第一個Hello World都沒作出來。
這一次,就讓咱們從改一個現成的應用開始吧。
首先,咱們從蘋果開發者中心下載一個示例代碼回來。我選了ToolBarSearch。
在本文檔的末尾,還有一些其它的網址能夠下載開源iOS產品或者代碼段,但我試了一下,仍是Apple Sample Code最容易成功。
下載回來的zip文件最好保存在"下載"或者"文稿"目錄裏,由於在Mac OS 10.8之前,有些目錄(例如/var/private/tmp)在Finder中是看不到的,要經過Finder的「前往 > 前往文件夾」功能才能進入。
有三種方式能夠打開一個iOS Project
打開Finder,進入剛剛下載解壓的ToolBarSearch目錄,找到ToolBarSearch.Xcodeproj文件,雙擊之,Xcode會自動啓動,並打開這個項目
在Xcode沒啓動的狀況下(若是Xcode已經啓動了,就先按Command Q退出),啓動Xcode,會彈出「Welcome to Xcode」的歡迎頁,點擊左下角的「Open Other」按鈕,找到ToolBarSearch目錄,雙擊ToolBarSearch目錄,或者雙擊ToolBarSearch.Xcodeproj文件均可以
若是Xcode處於打開狀態,能夠點擊其菜單欄的File -> Open,或者File -> Open Recent,而後再選擇要打開的項目
在Mac OS 10.8之前,有些目錄(例如/var/private/tmp),在Finder和Xcode的File > Open對話框中,點擊鼠標是找不到的,這時候就要經過命令行終端來打開了。
打開終端,執行:
cd /ToolBarSearch的父目錄/ToolBarSearch open -a Xcode
open -a是mac os的系統命令,除了iOS項目,別的項目也能夠這樣打開。
點擊Xcode左上角的Run按鈕(或者同時按下Comman和R鍵),Xcode會編譯源碼並在模擬器中運行這個應用。
編譯成功會在屏幕上淡淡地顯示「Build Succeeded」。反之,失敗就顯示「Build Failed」且不啓動模擬器。
在模擬器上看到「Performed search using…」了吧,下面咱們改掉它。
在Xcode左上角的Run按鈕下方,有一排小按鈕,從左到右第三個是一個放大鏡圖標,鼠標移上去會顯示「Show the Search Navigator」,點一下它,打開搜索界面,在它下方出現的Find輸入框中輸入「performed」
搜索結果只有一條:ToolbarSearchViewController.m,點文件名下方被高亮的「Performed」字串,右側代碼編輯區會自動打開這個文件,並滾動屏幕,使包含「Performed」的這一行出如今編輯區的中間。
修改雙引號裏的字串,隨便改爲啥,而後按「Command S」保存。
固然,這些操做,你也能夠在終端下經過grep和vim完成。
按Command R運行,看看,是否是看到效果啦?
是的,修改一個應用就這麼簡單。
Objective-C是蘋果應用軟件(包括蘋果電腦上的Mac OS App和移動設備上的iOS App)的開發語言。它是一種面向對象的編程語言。
蘋果公司還提供了一個軟件,叫Interface Builder,簡稱IB,用於可視化的界面製做,就像用Dreamweaver作網頁,或者像Visual Basic作桌面軟件同樣。後來IB就整合進了Xcode,成了Xcode的一部分。這篇文檔不講IB,只講Objective-C,由於:
Objective-C擴展了ANSI C,是C的超集,也就是說:
除了面向對象有語法是SmallTalk風格的(下面會講到),其它非面向對象的語法、數據類型,與C徹底相同,因此本文就再也不贅述。 來看一個經典的Hello World示例吧:
#import <Foundation/Foundation.h> int main(int argc, char *argv[]){ @autoreleasepool{ NSLog(@"Hello World!"); } return 0; }
是否是彷彿穿越回了大一學習C語言的時代,看起來和C幾乎沒有區別,是吧?是的,由於還沒用到它的面向對象特性,哈哈!
Objective-C的面向對象語法源自SmallTalk,消息傳遞(Message Passing)風格。在源碼風格方面,這是它與C Family語言(包括C/C++、Java、PHP)差異最大的地方。
在Java、C++世界,咱們調用一個對象的某方法,在Objective-C裏,這稱做給類型發送一個消息,這可不只僅是文字遊戲,他們的技術細節也是不一樣的。
在Java裏,對象和方法關係很是嚴格,一個方法必須屬於一個類/對象,不然編譯是要報錯的。而在Objective-C裏,類型和消息的關係比較鬆散,消息處理到運行時(runtime)纔會動態決定,給類型發送一個它沒法處理的消息,也只會拋出一個異常,而不會掛掉。
[obj undefinedMethod];
在代碼裏調用沒定義的方法(這是Java世界的習慣說法啊,專業的叫法是,給obj對象傳遞它沒法處理的消息),Xcode會警告,但編譯能成功,運行的時候會出錯。它會輸出這樣一個錯誤:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSObject undefinedMethod]: unrecognized selector sent to instance 0x8871710'
Objective-C中一些面向對象的概念,也能夠在Java中找到相似的實現(只能說是相似,不是徹底相同),個人讀者基本都是Java和PHP程序員,我會在下文中儘可能用Java的概念來類比。
GoogleCode上有人整理了Java和Objective-C的概念、數據類型對應表,參見這裏
Objective-C裏有字符串是由雙引號包裹,並在引號前加一個@符號,例如:
title = @"Hello"; if(title == @"hello") {}
PHP程序員要注意,在這裏不能用單引號,即便只有一個字符也不能用。Objective-C與Java、C同樣,雙引號表示字符串。
前文述及,不涉及面向對象時,它和C是徹底同樣的。如下是幾個函數調用的示例:
startedBlock();
NSLog(@"decrypted string: %@", str); CGRectMake(0,0,0,0);
[obj method];
對應的Java版本
obj.method();
[counter increase:1];
對應的Java版本
counter.increase(1);
對C Family程序員來講,這是最難接受的,最反人類的:
- (void) setColorToRed: (float)red Green: (float)green Blue:(float)blue {...} //定義方法 [myObj setColorToRed: 1.0 Green: 0.8 Blue: 0.2]; //調用方法
對應的Java版
public void setColorToRedGreenBlue(float red, float green, float blue) {...} myObj.setColorToRedGreenBlue(1.0, 0.8, 0.2);
UINavigationBar *bar = [[[UINavigationBar alloc] init] autorelease];
對應的Java版
UINavigationBar bar = UINavigationBar.alloc().init().autorelease();//Java沒有指針,因此星號去掉了
Objective-C的類分爲接口定義和實現兩個部分。接口定義(Interface)放在頭文件中,文件擴展名是.h,實現(implementation)放在實現文件中,文件擴展名是.m(也有.mm的擴展名,表示Objective-C和C++混編的代碼)。
接口定義也能夠寫在.m文件中,但最好不要這麼幹
須要注意的是,與Objective-C的interface概念最接近的是C和C++裏的頭文件,它與implementation是成雙成對出現的,做用是聲明類的成員變量和方法。它與Java的interface概念徹底不一樣:
在Objective-C裏,和Java的Interface概念類似的是Protocol,下文會講到。
請看示例:
Interface
@interface MyClass { int memberVar1; id memberVar2; } -(return_type) instance_method1; -(return_type) instance_method2: (int) p1; -(return_type) instance_method3: (int) p1 andPar: (int) p2; @end
Implementation
@implementation MyClass { int memberVar3; } -(return_type) instance_method1 { .... } -(return_type) instance_method2: (int) p1 { .... } -(return_type) instance_method3: (int) p1 andPar: (int) p2 { .... } @end
接口和實現以@interface、@implementation開頭,都以@end結束。「@」符號在Objective-C中是個很神奇的符號。
冒號也是方法名的一部分,method和method:是兩個不一樣的方法名,不是overload,第二個帶參數。
上述代碼對應的Java版:
public class MyClass { protected int memberVar1; protected pointer memberVar2; private int memberVar3; public (return_type) instance_method1() { .... } public (return_type) instance_method2(int p1) { .... } public (return_type) instance_method3andPar(int p1, int p2) { .... } }
寫在.h頭文件裏的方法都是公開的,Objective-C裏沒有私有方法的概念(沒有你說個蛋啊,哈哈哈哈)。
官方並無提到Objective-C怎麼實現私有方法,我查閱了stackoverflow,統一的答案是,要實現私有方法的效果只能藉助Category,不過,根據個人測試,即便採用了Category,也不能阻止外部的代碼調用這個「私有方法」,只是Xcode不支持「私有方法」的自動完成,並會有警告提示,運行的時候,仍是會成功的。各位看官知道有這麼回事就能夠了,這裏不深講。
類方法就是Java、PHP裏的Static Method,不用實例化就能調。類方法有一個加號前綴。 示例:
類定義
@interface MyClass +(void) sayHello; @end @implementation MyClass +(void) sayHello { NSLog(@"Hello, World"); } @end
使用
[MyClass sayHello];
實例方法就是Java、PHP裏的普通方法,必須實例化才能調。實例方法有一個減號前綴。 示例:
類定義
@interface MyClass : NSObject -(void) sayHello; @end @implementation MyClass -(void) sayHello { NSLog(@"Hello, World"); } @end
使用
mycls = [MyClass new]; [mycls sayHello];
selector就是一個方法指針,相似PHP裏的動態方法名:
<?php class Hello { public function sayHello() {} public function test() { $fun_name = "sayHello"; $this->$fun_name(); } }
在Objective-C裏,selector主要用來作兩類事情:
@implementation DemoViewController - (void)downButtonPressed:(id)sender {//響應「按鈕被按下事件」的方法 UIButton *button = (UIButton*)sender; [button setSelected:YES]; } - (void)drawAnButton { UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; btn.frame = _frame; btn.tag = 1; btn.backgroundColor = [UIColor clearColor]; [btn addTarget: self action: @selector(downButtonPressed:) forControlEvents: UIControlEventTouchUpInside];//當這個按鈕被按下時,觸發downButtonPressed:方法 } @end
@implementation ETHotDealViewController - (void)viewDidLoad { //獲取數據源 HotDealDataSource *ds = [[HotDealDataSource alloc]init]; [ds reload]; _items = ds.items; [self performSelector: @selector(refreshTable) withObject: self afterDelay: 0.5];//延遲0.5秒調用refreshTable方法 } -(void)refreshTable { [self.tableView reloadData]; } @end
這個例子中,獲取數據源是經過ASIHTTP組件異步調用服務端HTTP接口,refreshTable要用到數據源返回回來的數據,若是不延遲0.5秒,就會馬上執行,執行的時候數據還在路上呢,頁面就要變空白了。
繼承是寫在Interface定義裏面的。語法爲:子類名在左,父類名在右,中間用冒號分隔。 示例:
@interface MyClass : NSObject @end
對應的Java版本是:
public class MyClass extends NSObject { }
就是Java、PHP裏的Interface。
協議的定義用@protocol關鍵字:
@protocol Printable -(void)print:(NSString)str; @end
對應的Java版本是:
publilc interface Printable { public void print(String str); }
協議自己也能夠繼承別的協議:
@protocol Printable <NSObject> -(void)print:(NSString)str; @end
對應的Java版本:
public interface Printable extends NSObject { public void print (String str); }
協議能夠包含可選方法,顧名思義,可選方法能夠不被類實現:
@protocol Printable @optional -(void)print:(NSString)str; @end
加了@optional關鍵字,一個類在implements這個協議時,即可以不實現print:方法。
Java裏沒有相似的實現,除了Collection裏會有一些方法帶有optional的註釋,但Collection是個特例。
一個類實現某些協議是寫在Interface定義裏面的。語法爲:協議名用尖括號包裹,多個協議名用逗號隔開,協議寫在父類的右邊(若是沒有父類就直接寫在子類右邊)。
示例:
@interface class MyClass : NSObject <Printable, Drawable> @end
Printable, Drawablw就是兩個協議。
對應的Java版本是:
public class MyClass extends NSObject implements Printable, Drawable { }
分類能夠給一個已經存在的類增長方法,而不用去改它的源碼。Java和PHP中都沒有相似的特性。
好比說,NSObject是一個Objective-C內置的系統類,咱們想給它增長toJson方法,就像這樣:
頭文件:NSObject+Json.h
@interface NSObject (Json) -(NSString)toJson; @end
實現文件:NSObject+Json.m
@implementation NSObject (Json) -(NSString)toJson { //... } @end
使用的時候,只要包含NSObject+Json.h,實例化NSObject類,就可使用toJson方法了:
import "NSObject+Json.h" @implatementation XYZController -(void)test { NSObject *obj = [[NSObject alloc]init]; NSString *str = [obj toJson]; } @end
固然了,NSObject原本的那些方法依然仍是能夠用的,什麼都沒變,只是多了個toJson方法。看起來是否是和繼承沒太多差異呢(除了使用的時候實例化的是NSObject,而不是JsonObject)?再看一個繼承實現不了的例子:
頭文件:NSObject+Json+XML.h
@interface NSObject (Json) -(NSString)toJson; @end @interface NSObject (XML) -(NSString)toXML; @end
實現文件:NSObject+Json+XML.m
@implementation NSObject (Json) -(NSString)toJson { //... } @end @implementation NSObject (XML) -(NSString)toXML { //... } @end
使用:
import "NSObject+Json+XML.h" @implatementation XYZController -(void)test { NSObject *obj = [[NSObject alloc]init]; NSString *json = [obj toJson]; NSString *xml = [obj toXML]; } @end
Cocoa是Mac OS App的開發框架,Cocoa Touch是iOS開發用的框架,Cocoa Touch和Cocoa大部分是同樣的,只是Cocoa Touch多了一些移動設備特有的東西,如:觸摸屏、加速度傳感器、GPS定位。Cocoa中多任務、多窗口的特性,在Cocoa Touch中也是沒有的(或者跟Cocoa不徹底同樣的)。
就像學了Java語言還要再學一些Spring、Hibernate、Struts(或者其它相似的Java類庫)才能開始作J2EE應用同樣,學過Objective-C語言以後,也要再學習Cocoa Touch框架才能順利地開發iOS應用。
Cocoa Touch大量使用Delegate(委派)設計模式。
快捷鍵:Comman R
推薦在Finder中新建好的再添加進來
在Xcode中打開你的項目,在Xcode頂部工具欄的Stop按鈕(Run按鈕右邊那個黑色正方形按鈕)右邊,有個下拉菜單,顯示着 「ToolBarSearch > iPhone 5.0 Simulator」 (即 你的應用英文名 > 當前選中的調試 ),點擊這個下拉菜單,選中iPhone 5.0 Simulator(這裏的5.0是指iOS版本,不是iPhone5的意思,若是你的項目是iPad應用,請選iPad 5.0 Simulator),再按「Run」按鈕,Xcode就會自動把當前正在編輯開發的應用編譯並安裝到模擬器上。
在模擬器上操做時,若是執行過程當中遇到了你在Xcode裏設置的斷點,模擬器會暫停運行,並將當前活動窗口切換回Xcode,供你調試。
在Xcode裏增長或者取消了斷點,不須要從新編譯和安裝應用便可生效。
模擬器的「硬件」菜單,能夠選擇想要模擬什麼設備,有iPad、iPhone可選。
在模擬器的「版本」菜單,能夠選擇要模擬什麼版本的iOS。設備和版本是彼此獨立的,iPhone 4S能夠有5.0,5.1,6.1幾種iOS版本,固然了,iPhone 5不可能有4.3的iOS版本。
用鼠標點擊(不區分左右鍵)模擬器上的iPhone、iPad屏幕,就是在模擬用手指觸摸iPhone,iPad的屏幕,能夠實現一些觸摸效果好比:
多指手勢比較複雜,在白蘋果筆記本上能夠模擬簡單的雙指手勢,白蘋果的觸控板自然支持多指觸摸,但要定位到模擬器的區域再響應多指手勢就須要藉助一些額外的鍵啦:
手機上特有的輸入法(好比九宮格輸入法)不能模擬。模擬器默認的iOS軟鍵盤只有英文輸入,在測試應用的時候,咱們要用到中文,有兩個辦法:
若是要輸入大量文本,使用模擬器裏的軟鍵盤效率過低,這時候可使用物理鍵盤,方法是:在Mac OS頂部的模擬器菜單欄,點擊」硬件」菜單,勾選下拉菜單中的「模擬硬件鍵盤」。之後再用模擬器運行iOS應用時,點擊iOS應用中的輸入框,軟鍵盤就不彈出來了,可直接使用Mac電腦的物理鍵盤輸入。
注意:
但Mac電腦沒有定位用的硬件(GPS)和軟件基礎,所以模擬器不能自動得到當前的地理位置,不能用模擬器測試定位功能。(注意,雖然WiFi也能夠獨立定位——iPad WiFi版沒有GPS也能夠定位,但Mac電腦的WiFi不具有定位相關的軟件)
要在模擬器裏測試依賴地理位置的功能(如」我附近的xx」),能夠手工指定一個經緯度給模擬器,方法:在Mac電腦頂部的模擬器菜單,點擊」調試 - 位置 - 自定位置」,會彈出一個對話框,在彈出的框內填入經緯度便可。
如何得到經緯度? 上谷歌地圖(ditu.google.cn),在地圖上找到你想要的位置(好比你想知道杭州大廈的位置,就在經過搜索框找到杭州大廈),點擊右鍵,選擇「這兒是什麼」,搜索框中就會出現這個位置的經緯度了,前面是緯度,後面是經度。我們天朝的版圖,都是北緯和東經。
Mac電腦有攝像頭,但Mac OS沒有設計API給iOS模擬器調用,因此,不能用模擬器測試對焦閃光燈等功能。
要在模擬器上測試依賴照片的功能,能夠在代碼裏作一個workaround,即當代碼檢測到攝像頭不可用時,彈出一個照片選擇器,讓測試人員從相冊裏選擇一幅照片,來進行後續的操做(如照片美化、人臉識別、條碼掃描)。
模擬器能驗證你開發的iOS應用的大部分功能,但有些Mac設備上不具有的硬件,模擬器是不能模擬的。前文提到了一個繞過這些限制的辦法,但獲取當前位置、拍照、加速度感應這些是模擬不了的,一款應用發佈給消費者以前,必需要在真實設備上驗證過。
將未提交App Store審覈經過的應用安裝到iOS設備上測試,有三種辦法:
破解Xcode是違法行爲(越獄是合法的),並且挑版本挑得厲害,不是全部Xcode版本都能破解,也不是全部Xcode的破解版都能和越獄的iOS配合好。越獄+SSH上傳跟企業部署同樣效率低(部署效率低,沒法激活Xcode中的斷點),只能用於QA驗收,不適合開發自測。綜上所述,最適合開發實時測試的就是第一個正規途徑了。下面重點講這個:
蘋果的Developer Program分爲我的開發者和公司開發者,分別是每一年99美圓和每一年299美圓,分別能夠註冊100臺和500臺蘋果測試設備。這個臺數限制在一個付費年度內不會清空,好比說,2013年4月1日付費成功的,付費會員資格在2014年3月31日以前有效,這期間,註冊一臺就少一個名額,哪怕這個設備註冊進來用了以後一分鐘立刻又刪掉了,減小的這個名額也不會回來。
在交錢以前,最好問一下,周圍的同事,有沒有已經交了錢的。若是有,你只須要註冊一個免費的Apple ID(就是你在App Store安裝軟件用的Apple ID),請他發個邀請郵件給你,把你的Apple ID加入他的團隊就能夠了,蘋果會認爲大家兩我的是一個團隊的,大家分別用本身的帳號,共享100臺設備的限額,這是合法的。
不想看下面各類點擊各類頁面跳轉的直接用瀏覽器訪問證書管理,你要登陸你就用Apple ID登陸(前提是交過錢,或者找交了錢的人把你加入團隊了)。
不嫌煩,或者想知道下次沒我這個文檔的時候怎麼進證書管理嗎?按這個步驟操做:
頁面上有一個「Your Certificate」區域,下方有個Download圓角按鈕,這是你的我的證書,下載下來。再下面一行,有一句「If you do not have the WWDR intermediate certificate installed, click here to download now」,這個是蘋果的公共證書,也下下來。
雙擊下載回來的證書,裝證書時,會提示你輸入密碼,這是【鑰匙串訪問工具】在問你要你的Mac OS帳號開機密碼(至關於linux裏面的sudo),不是Apple ID的密碼,不要搞錯了。
若是你是和其它同事公用的帳號,讓他給你一個私鑰便可,就是一個擴展名爲p12的文件,雙擊之,鑰匙串訪問會自動出來,須要你輸入一個密碼,這個密碼問給你p12文件的人要,不是你的Mac OS系統開機密碼,也不是你的Apple ID密碼。
回到Xcode主界面,在Stop按鈕(Run按鈕右邊那個黑色正方形按鈕)右邊,有個下拉菜單,顯示着 「ToolBarSearch > iPhone 5.0 Simulator」 (即 你的應用英文名 > 當前選中的調試 ),點擊這個下拉菜單,選中你的真機設備名,再按「Run」按鈕,Xcode就會自動把當前正在編輯開發的應用編譯並安裝到真機上測試啦!
IPA包本質上是一個ZIP壓縮包,只不過它有着特殊的目錄結構,擴展名是ipa,製做方法以下:
除App Store外,還有許多其它的iOS應用市場(如91助手,同步推等等),若是一個應用須要發佈到不少個應用市場,且他們的代碼略有不一樣(好比說,統計代碼不一樣),按上述方法手工修改源碼再打包,再還原,比較容易出錯。好消息是,Xcode是有命令行的,咱們能夠寫一個shell腳本,先用se自動修改源碼,再調用Xcode的命令行來編譯以獲得your——app.app目錄,最後調用zip、mv等命令把上一個章節講的ipa打包動做自動執行。
iOS App裏的控件尺寸和字體大小都是指Point,Retina設備(iPhone 4,4S,5;the new Pad)和非Retina設備(iPhone 3GS,iPad,iPad 2)的Point數是同樣的,儘管iPhone 4的分辨率是3GS的2倍。好比說,10point在Retina設備裏是20 pixel,在非Retina設備(iPhone 3G)上則是10 pixel。
項目成員間交流時,應使用Point,不要使用pixel。
iOS應用中常常出現xxxx@2x.png這樣的文件名,它們是給retina設備用的高分辨率大圖,用svn命令行操做它們的時候會被@符號干擾,解決方案是在svn命令末尾加上一個@符號,如:
svn del icon@2x.png@ svn info Default@2x.png@
若是一次移動了幾十個png文件再svn commit的,能夠用shell批處理:
svn status | awk '($1=="!"){print $2}' | grep -v @ | xargs svn del
上面這個命令是將文件名不包含@符號的,且已經不在硬盤上的文件從svn version controll中刪掉
for file in `svn status | awk '($1=="!"){print $2}' `; do svn del $file"@"; done
上面這個命令是將文件名包含@符號的,且已經不在硬盤上的文件從svn version controll中刪掉
svn add同上, 如法炮製便可.
推薦在Finder裏建好目錄再到Xcode的Project Navigator中點擊「Add Files to」添加到項目中
iPhone 5與以前的iPhone不同,採用了4寸Retina屏,因此它的Point數變成了320 * 568 points