web-dev-qa-db-ja.com

iOS:xibファイルの読み込みにデバイス修飾子を使用していますか?

デバイス修飾子(つまり〜ipad)を使用して、Info.plistにデバイス固有のキーを提供し、デバイス固有の起動画像(iPhoneの場合はDefault.png、iPadの場合はDefault〜ipad.png)を指定できます。例)。これら2つのことは Apple Docs で具体的に説明されていますが、これが他の種類のファイルで機能するとは述べていません。

私は(偶然にも)これがinitWithNibName:bundle:経由で.xibファイルをロードするために機能することを発見しました。したがって、たとえば、MyView.xibとMyView〜ipad.xib、および次のコードを使用できます。

MyViewController *viewController = [[MyViewController alloc] 
                                     initWithNibName:@"MyView" bundle:nil];

... iPadではMyView〜ipad.xib、他のデバイスではMyView.xibを完全にロードします。

それで、1)これはどこかに文書化されていますか? Appledocs。UI_USER_INTERFACE_IDIOM()をチェックして、どこにでも2つの異なるnib名をハードコーディングするよりも確かに便利ですが、そうでない場合はちょっと信用できません文書化。

そして、2)これが機能し始めたiOSのバージョンを誰かが知っていますか?私は4.2で試してみただけで、そこで機能します。一般的に、デバイス修飾子は(上記の文書化されたものでも)4.0以上です。

49
zpasternack

実際、それはドキュメントで明示的に定義されていますが、脚注としてです。

CocoaNibs

「NSBundleを使用したNIBファイルのロード」の下部にあるメモ:

注:iOS用のユニバーサルアプリケーションを開発している場合は、デバイス固有の命名規則を使用して、基になるデバイスの正しいnibファイルを自動的にロードできます。 nibファイルに名前を付ける方法の詳細については、「iOSがデバイス固有のリソースをサポートする」を参照してください。

Cocoa Conceptual LoadingResources へのリンク

ただし、はい、これは4.0以降のみの機能です。

25
Caleb Shay

私も同じ問題を抱えていました。答えは最初は意味がありませんでしたが、良い知らせはそれが簡単にできることです! :)

修飾子なしのiPad xibsと〜iphone修飾子付きのiPhone xibsに名前を付けるだけで、正しく選択されます。

したがって、MyViewControllerを使用すると、MyViewController.xib for iPadおよびMyViewController~iphone.xib for iPhone。その後、単純なalloc/initを使用して、ビューコントローラを初期化できます。

[[MyViewController alloc] init]そして、それは右のxibを取得します。

したがって、XCodeで新しいビューコントローラーを作成するときは、常にボックスを選択してipad用にフォーマットします。作成するxibの名前はMyViewController.xibで、iPadサイズのxibにする必要があるためです。次に、iPhone用にフォーマットされた2番目のxibを作成し、〜iphone修飾子を付けて名前を付けます。

ドキュメントは少し矛盾することがありますが、このページでは、識別子を持つリソースがデフォルトでiPadに設定される方法について説明しています。

ImageSoundResources

高解像度画像の使用に関するセクションを確認してください。私たちは画像ではなく、xibsを話していることを知っていますが、それはうまくいきます。私の最後の6つのアプリはすべてこのイディオムを使用しました。

50
Kenny Wyland

私はあの男になりたくないので、自分の質問に答えますが、答えは次のとおりです。

1)いいえ、明示的に文書化されていないApple文書、および
2)4.0以上(これは私自身のテストに基づく)

保存するのは、UI_USER_INTERACE_IDIOM()をチェックする数行のコードです。それでも、私はそれを取ります。少ないコードは少ないコードです。

3
zpasternack

IOS 3.2以降で使用する適切な手法は、UI_USER_INTERFACE_IDIOM()関数です。通常、三項演算子を使用して、適切なXIBでUIViewControllerを初期化します。

UIViewController* controller = [[UIViewController alloc] 
    initWithNibName:UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? 
    @"YourViewController-iPad" : @"YourViewController" andBundle:nil];
2
Wayne Hartman