iPhone 移植到 iPad:
方法一 修改裝置目标設定(普通模式:一套代碼及XIB界面檔案,代碼分if和else來分别處理多種裝置)
預設情況下,所有的iPhone程式都會運作在他們原始的螢幕大小320x480(非全屏狀态),如果你想讓你的程式運作在iPad上,且為全屏狀态,你需要修改項目設定你們的Targeted Device Family選為iPhone/iPad(這種模式使你的程式可以自動檢測運作的裝置類型,并使你的程式全屏顯示)。
将iPhone運作的iOS版本切換到iPad運作的版本。(目前iPhone iOS系統版本為4.1,iPad為3.2)。
修改目标裝置族(Build裡面的Targeted Device Family選為iPhone/iPad )。
現在可以使你的程式運作在iPad上了。但是,你會看到你的界面(UI)和iPhone下面完全一樣,這不是我們需要的。是以,重新布局你的Views是程式員的責任,即重定位(reposition)Views。
首先,我們需要手工檢測運作的裝置類型。(使用預編譯指令)
#if(__IPHONE_OS_VERSION_MAX_ALLOWED>=30200)
NSString *str;
if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad){
//iPad 版本代碼;
}
else
//iPhone/iPod touch 版本代碼;
#endif
或者
#define isPad (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)。UI_USER_INTERFACE_IDIOM()方法傳回值UIUserInterfaceIdiomPhone或UIUserInterfaceIdiomPad。
▪ 方法二 建立通用類型程式(兩套代碼及XIB界面檔案,兩套代碼及界面互不相幹)
上一種方法的缺點是,你必須自己寫兩個版本(iPhone/iPod 和iPad)的代碼來适配不同的平台,同時要動态修改UI布局(及控件尺寸等),是挑戰,但也很痛苦。是以,Apple建議你建立“Universal”,即通用型的應用。這樣的應用可以在iPhone和iPad下面運作。這需要為各個平台建立相應的.h,.m和.xib檔案。背景業務代碼自然要寫在相應版本的.h,.m檔案裡面。
更新項目的裝置目标到iPad。實質上,這裡Xcode把項目的Targeted Device Family 設定修改成了iPhone/iPad。Xcode會建立MainWindow.xib檔案的副本,并命名為MainWindow-iPad.xib。這時,這兩個檔案都包含“projectname”ViewController這個ViewController。如下圖:
添加新的對應iPad版本的xib檔案到Resource-iPad檔案夾。命名規範:“iPad‘功能’ViewController.xib”(或者‘功能’ViewController-iPad.xib”),生成.h,.m,.xib檔案。并将這些iPad版本的xxViewController連接配接到MainWindow-iPad.xib(和正常的iPhone版本一樣)。
這樣,選擇不同的模拟器(Simulator)就可以看到同一套代碼處理過的相應版本的界面效果。
注:首先選擇Upgrade the Device Target For iPad ,這裡Xcode把項目的Targeted Device Family 設定修改成了iPhone/iPad。MainWindow.xib和MainWindow-iPad.xib作為兩個版本的入口,其他相應版本的ViewController連接配接到自己的MainWindow(-iPad).xib檔案即可。
看到的效果是:
▪ 方法三 維護兩套UI庫(一套代碼及兩套XIB界面檔案,兩套界面公用一套代碼)
這種情況下,你會得到兩個可執行體(executables),一個for iPhone/iPod touch,一個 for iPad。
建立iPhone的應用,更新到iPad相容。方法同二,不同的是,方法二選的是One Universal application,而這裡選的是Two device-specific applications。
這樣的話,與方法二建立相應的-iPad版本檔案不同的是,這裡是将iPhone版本的檔案直接拷貝進Resource-iPad檔案夾,檔案名稱一樣。代碼隻需要一份,隻不過需要把Resource和Resource-iPad檔案夾下的xxViewController的File's Owner都設定為Classes檔案夾裡面的同一個xxViewController類就可以了,其他界面UI元素設定連接配接到File's Owner。同時,會産生兩個版本的可執行體(executables),“projectname”.app和“projectname”-Upgraded.app。
看到的效果是:同一套代碼處理過的相同結果的界面。
總結:由于實際項目背景生成控件,尤其是TableView會比較多,為了适應iPhone和iPad,可以考慮用第三種方法,一套代碼,兩套XIB界面。背景加載時,用:
if(isiPad){
UITableViewController *tableViewController=[[UITableViewController alloc] initWithNibName:@"iPadxxViewController" bundle:nil];
else {
UITableViewController *tableViewController=[[UITableViewController alloc] initWithNibName:@"iPhonexxViewController" bundle:nil];
即可。iPadxxViewController和iPhonexxViewController分别代表相應的iPadxxViewController.xib和iPhonexxViewController.xib檔案。
希望對大家有用