iPhone アプリを Xcode のメニューからユニバーサル化できますが、多分やり方が悪いのだと思うのですがどうもうまくいかないので面倒なので手作業でやることにしました。(アップルのマニュアルには必ず Xcode のメニューからやれって書いてあるので、やるときは自己責任でお願いします。

手作業でできると iPad アプリを先に作ってそれをユニバーサル化することもできるので覚えておいて損はないと思います。

plist で iPad 用の Main nib ファイルを設定する

info.plist で Main nib file base name に “MainWindow” が指定されていると思います。この nib ファイルがアプリの起動時に使用されます。そこで iPad のときに使用する nib ファイルを “Main nib file base name (iPad)” を追加して指定します。iPad アプリを iPhone 化するなら “Main nib file base name (iPhone)” です。

ターゲットデバイスの設定

プロジェクトの編集メニューから “Target Device Family” の値を “iPhone/iPad” に変更します。また “iOS Deployment Target” も iPad が動作する iOS3.2 かそれ以下のバージョンに変更します。

ここまで終わるとアクティブな実行可能ファイルとして iPad シュミレータが選択可能になります。

iPad 用の MainWindow.xib ファイルを作成する

Resources-iPad というグループを作成してその中に MainWindow-iPad.xib というファイルを作成します。作成時に Product で iPad を選択するのをお忘れなく。

MainWindow-iPad.xib を IB で開き、MainWindow.xib を参考にして MainWindow-iPad.xib を修正していきます。下図は修正前の MainWindow-iPad.xib です。

- File’s Owner を UIApplication に変更
- MainWindow.xib より AppDelegate と ViewController をコピーする
- UIApplication の delegate を AppDelegate に接続
- AppDelegate の window を UIWindow に接続

下図が修正後の MainWindow-iPad.xib です。

iPad 用の xib ファイルを追加する

上記手順までだと MainWindow-iPad.xib を使ってアプリが起動してもコントローラの xib が iPhone 用のままです。そこで iPad 用の xib ファイルを追加して、MainWindow-iPad.xib では iPad 用の xib ファイルを使うことにします。

まず、ViewController 用の xib ファイルを追加します。 ここでも作成時に Product で iPad を選択するのをお忘れなく。名前は iPhone 用の xib ファイルが “TestViewController” なので、”iPadTestViewController” としておきます。

追加後に、IB で開き File’s Owner を TestViewController に変更して、view を接続しておきます。

MainWindow-iPad.xib 内の ViewController が使用する NIB Name を先ほど作成した “iPadTestViewController” に変更します。

これで iPad シュミレータで起動すれば、iPad 用の xib ファイルが使用され、iPhone シュミレータで起動すれば iPhone用の xib ファイルが使用されるユニバーサルアプリになりました。

コード内で読み込み xib ファイルを変更する

UIViewController の中からコードで UIViewController を生成する際に iPhone/iPad で xib ファイルを変えるには以下のようにします。

NSString* nib;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  // this device is iPad
  nib = @"iPadHogeViewController";
} else {
  // this device is iPhone
  nib = @"HogeViewController";
}
HogeViewController* vc = [[HogeViewController alloc] initWithNibName:nib bundle:nil];

以上で、手作業でユニバーサルアプリ化ができました。推奨されている Xcode のメニューからやる方法でないのでオススメはできませんが、何をしているかが理解できますし、iPad アプリからユニバーサル化できるので覚えておいて損はないと思います。

関連する投稿