私のアプリは、iPad 専用アプリとして誕生しました。現在、iPhone に適した小さいバージョンに変換しています。私は同じコードベースを使用していますが、コントローラーの多くは実際にはあまり変更する必要はありません。小さな画面に合わせてビューを作り直すだけです。iPad と iPhone のバージョンでは一部の機能が異なり、App Store での価格も大きく異なるため、これはユニバーサル アプリではありません。
デバイス ファミリを iPhone に設定して別のターゲットを追加しました。元のターゲットでは、これが iPad に設定されています。
ファイルview~iphone.xib
名がview.xib
.
問題は、iPhoneビルドを iPad で実行するときです。ご想像のとおり、iPhone アプリはその小さな iPhone ウィンドウで実行されます (2 倍に拡大できます)。しかし、ロードされたペン先はiPadのペン先であり、明らかに iPhone サイズのディスプレイに適合しないか、サイズ変更されません。iOS が iPhone バージョンを自動的に読み込まない理由がわかりません。をテストUI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
すると false が返されるので、iPhone モードで実行されていることがわかります。
顧客が iPad で iPhone アプリを実行するのを止めることはできないので、それを正しく動作させたいと考えています。私はいくつかのことを試しましたが、正しくないようです:
- コードを に変更する
[[MyViewController alloc] initWithNibName:@"MyView~iphone" bundle:nil];
と正しい nib がロードされますが、それは nib 名が指定されているすべての場所に条件付きコードを配置する必要があることを意味します - これは大きなアプリなのでたくさんあり、エラーが発生しやすい可能性があります将来、私または別の開発者が新しいコードでこれを行うのを忘れたときに。 - すべての
~iphone
nib の名前を iPad バージョンと同じファイル名になるように変更し (つまりview.xib
)、それらを別のディレクトリに移動し (オリジナルの名前と衝突しないように)、それらをプロジェクトに再度追加しますが、含まれているだけです。 iPhone ターゲット (iPad ターゲットではなく) で、元の iPad nib を iPhone ターゲット (ただし iPad ターゲットにはまだ含まれている) からチェックを外すと、実行時に正しい nib がロードされます (「間違った」nib は存在しないため)。命名に関係なく、各ビルドのバンドルでより長くなります)。ファイル名view~iphone.xib
をCould not load NIB in bundle
. ファイル名が同一であるため、この方法は非常に不快であり、一見しただけでは何が起こっているのかわかりません。 - 元の xib の名前を
view~ipad.xib
(iPhone の nib を にview~iphone.xib
) 変更しても、iPad で iPhone ビルドを実行すると iPad の nib が読み込まれます。
これらのいずれかよりも良い方法があるはずですか? デバイスが iPhone アプリを実行していることを明確に認識しているのに、間違った (iPad) nib が読み込まれるのはなぜですか?