1

私は Xcode 4.2 を使用しており、ユニバーサル アプリを作成中です。新しいプロジェクトを開始するときに、SingleView アプリケーション テンプレートを選択しました。XCode は、ViewController1.h、ViewController1.m、ViewController1_iphone.xib、および ViewController1_iPad.xib を追加しました。さらに UI を追加する必要があり、File...New...New File をクリックし、UIViewController サブクラス テンプレートを選択すると、2 つのチェックボックスが表示されます (iPad を対象とし、ユーザー インターフェイスに Xib を使用)。

iPad と iPhone の両方をサポートすると同時に、同じコードを共有する共通の .h ファイルと .m ファイルを使用するには、どうすればよいでしょうか。ビュー コントローラーでこれを実行して、iPad と iPhone のどちらであるかを確認するコードを追加する必要がありますか?

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
} else {
}

また、~iPad や ~iPhone について話している人も見てきました。これは何ですか?

私の理解が正しければ、画面サイズが異なるため、iPadとiPhoneの両方でUIを別々に設計する必要がありますか?

私はここで完全に混乱しています。

助けてください。

4

5 に答える 5

6

2 つのペン先 (iPad 用と iPhone 用に 1 つ) を追加するか、いずれかのインターフェイスに適切にスケーリングするペン先を 1 つ追加することができます。通常、画面のすべてまたはほとんどをカバーするビューを作成する場合は 2 つのペン先を追加し、iPhone ではフルスクリーンになるが、 iPad のポップオーバー。

チルダ サフィックス~ipadおよびについては、リソース プログラミング ガイドの「iOS がデバイス固有のリソースをサポート~iphoneする」という見出しの下で説明されています。接尾辞は、質問に書いたキャメルケースではなく、完全に小文字であることに注意してください。iOS は大文字と小文字を区別するファイルシステムを使用するため、これは重要です。

またはのNSBundleようなメッセージを使用してリソースのパスを取得すると、iOS はまず、現在のデバイスに応じて、またはのサフィックスを持つリソース ファイルを探します。たとえば、次のようにするとします。-[NSBundle pathForResource:ofType:]-[NSBundle URLForResource:withExtension:]~ipad~iphone

NSString *path = [[NSBundle mainBundle] pathForResource:@"setup" ofType:@"plist"];
  • これを iPhone タイプのデバイス (iPod touch を含む)、または iPhone モードのシミュレーターで実行すると、iOS は最初にアプリ バンドルで という名前のファイルを探しますsetup~iphone.plist。そのようなファイルが見つかった場合、そのファイルのパスが返されます。そのファイルが見つからない場合は、代わりに へのパスを返しますsetup.plist

  • これを iPad タイプのデバイス、または iPad モードのシミュレーターで行う場合、iOS は最初にアプリ バンドルで という名前のファイルを探しますsetup~ipad.plist。そのようなファイルが見つかった場合、そのファイルのパスが返されます。そのファイルが見つからない場合は、代わりに へのパスを返しますsetup.plist

バンドルからリソースを取得する他のすべての API は の上に構築されているNSBundleため、すべてこのデバイス固有のルックアップの恩恵を受けます。つまり、 を使用する+[UIImage imageNamed:]と、バンドルにデバイス固有のイメージがある場合は、デバイス固有のイメージが自動的に使用されます。を使用すると、デバイス固有の nib ( ) ファイルがバンドルにあれば、-[NSBundle loadNibNamed:owner:options:]自動的に読み込まれます。.xib

サフィックスを使用すると、コードが簡素化されます。と を作成するMyViewController~ipad.xibMyViewController~iphone.xib、アプリは現在のデバイスに適したものを自動的に読み込みます。ユーザー インターフェイスのイディオムを確認する必要はありません。NSBundleあなたのためにそれをチェックします。(名前MyViewController~ipad.xibMyViewController.xiband を使用して同じ効果を得ることもできます。)

ここで、「ユニバーサル」プロジェクトを作成したときに、Xcode がプロジェクト ファイルにViewController1_iPhone.xibおよびという名前を付けたことに気付いたかもしれViewController1_iPad.xibません。これはチルダ サフィックスを使用せ、ユーザー インターフェイス イディオムを調べて、それに応じてファイル名を選択するコードを含んでいました。ユニバーサル プロジェクト テンプレートがこれを行うのはなぜですか? わかりませんが、ばかです。ファイル名をチルダ サフィックスを使用するように修正し、ユーザー インターフェイスのイディオムをチェックするコードを削除することをお勧めします。

于 2012-12-22T22:11:25.277 に答える
1

これがあなたが望むものです:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 
{
    storyboard = [UIStoryboard storyboardWithName:@"ViewController1_iphone" bundle:nil];
}
else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
{
storyboard = [UIStoryboard storyboardWithName:@"ViewController1_ipad" bundle:nil];
}
于 2012-12-23T05:11:50.363 に答える
1

.xib ファイルをストーリーボードに移動することをお勧めします。1 つは iPhone 用、もう 1 つは iPad 用です。それらは開発に多くの喜びをもたらし、習得も容易です。

次に、カスタム クラスをビュー コントローラーに割り当て、UI 要素をコードにリンクします。両方のストーリーボードに対してこれを行うと、共通の .h/.m ファイルを参照することで両方が同じコードを共有できます。

プロジェクト設定では、アプリがユニバーサル開発用に構成されたら、適切なストーリーボードを iPhone/iPad 展開情報に割り当てます。

于 2012-12-22T22:06:46.567 に答える
1

物事を実装し、物事を構造化する方法を選択する方法は多かれ少なかれあなた次第ですが、私は次のアイデアで作業する傾向があります。

  • 「Target for iPad」および「With Xib」オプションを無視します (ストーリーボードを使用しない場合。後で参照)。
  • すべての共有コードを保持する親ビュー コントローラーを作成します。EG MainViewController
  • iPad と iPhone の両方に対して、これの 2 つのサブクラスを作成します。EG MainViewController_iPhone および MainViewController_iPad (あなたが言及した MainViewController~iPhone を使用できます。ここでは単に名前付けの設定の問題です)
  • iPhone と iPad の間で共有したいコードは MainViewController 親クラスに固定し、各デバイスに固有のものはすべて適切なサブクラスに配置します

通常、iPhone または iPad で実行している場合は、実際にテストする必要はありません。それが間違っていてやってはいけないというわけではありませんが、このようにクラス分けをすることで、本当にやる必要がなくなるはずです。しかし、私がやりたいのは、デバイスが処理できる方向を処理するときに実行しているデバイスを確認し、これを共有の親ビュー コントローラーに入れることです。

UI に関しては、3 つのオプションがあります。- ストーリーボードを使用する (これをお勧めします) - 別の XIB ファイルを使用する - すべてを手動でコーディングする

iOS にどれだけ慣れているかにもよりますが、すべてを手動でコーディングする方が効率的ですが、時間がかかる可能性が高くなります。インターフェイス ビルダーを使用するのは素晴らしく簡単ですが、カスタマイズしたい場合はコードで行う必要がありますが、それで問題ありません。

ストーリーボードを使用して、さまざまな XIB ファイルが読み込まれないようにすることをお勧めします。また、インターフェース用に 2 つのファイルがあるだけなので、iPhone と iPad 間の分割も簡素化されます。1 つは iPhone 用のすべての画面を備え、もう 1 つは iPad 用のすべての画面を備えています。iOS は起動時に適切なストーリーボードを自動的にロードするので、何もする必要はありません。次に、View Controller とビューを取得するには、次のようにします。

MainViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainViewControllerIdentifier"];

識別子はストーリーボード内で指定されることに注意してください。

これが少し役立つことを願っていますが、さらに質問がある場合は、すぐに発砲してください:)

于 2012-12-22T22:11:23.547 に答える
0

nib ファイルMyNib.xibに とという名前を付けるとMyNib~ipad.xib、アプリが実行されているデバイスに応じて、必要な nib が自動的に読み込まれます。ただし、必ずしも異なるペン先を作成する必要はありません。多くのカスタマイズを必要とせず、autoresizingMasks で解決できる場合、またはプログラムでいくつかのフレームを設定している場合は、ペン先が 1 つだけで解決できます。"targeted for ipad" の部分をチェックすると、ペン先のビューが大きくなり、グループ化されたテーブルの外観が少し異なりますが、結果の他の違いはわかりません.

お役に立てれば!

于 2012-12-22T22:12:35.687 に答える