2

画像アセットを「architecture.png」という名前にして、名前を「architecture~ipad.png」に変更して iPad バージョンにすることはできますか? そして、コードで次のように使用します。

[UIImage imageWithName:@"architecture.png"];

次に、これはアーキテクチャーを探しますか? iPad バージョンの ipad を探しますか?

4

2 に答える 2

5

アプリに 2 つの画像リソースがある場合:

  • 「architecture.png」(iPhone版)
  • 「建築~ipad.png」(iPad版)

それから

[UIImage imageWithName:@"architecture.png"]

iPhone/iPad デバイスに正しいものを自動的にロードします。

(DOOManiac が正しく気づいたように、これは iOS 4 以降で動作します。)

詳細については、「リソース プログラミング ガイド」の「iOS がデバイス固有のリソースをサポートする」を参照してください。

于 2012-10-24T21:40:46.730 に答える
3

アップデート:

リンクiOS Supports Device-Specific Resources から、これは iOS 4.0 以降で可能のようです。

iOS 4.0 以降では、個々のリソース ファイルを特定の種類のデバイスでのみ使用できるようにマークすることができます。この機能により、ユニバーサル アプリケーション用に記述しなければならないコードが簡素化されます。iPhone 用のリソース ファイルの 1 つのバージョンと iPad 用の別のバージョンのファイルをロードするために別々のコード パスを作成するのではなく、バンドルのロード ルーチンに正しいファイルを選択させることができます。リソース ファイルに適切な名前を付けるだけです。

リソース ファイルを特定のデバイスに関連付けるには、そのファイル名にカスタム修飾子文字列を追加します。この修飾子文字列を含めると、次の形式のファイル名が生成されます。

<basename><device>.<filename_extension>

<basename>文字列は、リソース ファイルの元の名前を表します。また、コードからファイルにアクセスするときに使用する名前も表します。同様に、<filename_extension>文字列は、ファイルの種類を識別するために使用される標準のファイル名拡張子です。<device> 文字列は大文字と小文字が区別される文字列で、次のいずれかの値になります。

~ipad - リソースは iPad デバイスのみにロードする必要があります。

~iphone - リソースは iPhone または iPod touch デバイスにのみロードする必要があります。

デバイス修飾子は、任意のタイプのリソース ファイルに適用できます。たとえば、MyImage.png という名前の画像があるとします。iPad と iPhone で異なるバージョンのイメージを指定するには、MyImage~ipad.png と MyImage~iphone.png という名前のリソース ファイルを作成し、両方をバンドルに含めます。画像をロードするには、コード内で引き続きリソースを MyImage.png として参照し、次に示すようにシステムに適切なバージョンを選択させます。

UIImage* anImage = [UIImage imageNamed:@"MyImage.png"];iPhone または iPod touch デバイスでは、システムは MyImage~iphone.png リソース ファイルをロードしますが、iPad では、MyImage~ipad.png リソース ファイルをロードします。デバイス固有のバージョンのリソースが見つからない場合、システムはフォールバックして元のファイル名を持つリソースを探します。前の例では、MyImage.png という名前の画像になります。

iOS < 4.0 をサポートするデバイスの場合、以下のアプローチに従うことができます。しかし、私はそれがもう必要だとは思わない。相変わらずそのままです。

私が考えることができる 1 つの解決策は、iPad 用のマクロを定義して、すべての画像ファイルに ~ipad.png を追加することです。次に、このメソッドを使用している間は常にこのマクロを呼び出します。これにより、iPhone およびiPad 用[UIImage imageWithName:imageName(@"architecture")];に変換されます。[UIImage imageWithName:@"architecture.png"];[UIImage imageWithName:@"architecture~ipad.png"];

例:-

#define IMAGENAME(Name) (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)?[(Name) stringByAppendingString:(@"~ipad.png")]:[(Name) stringByAppendingString:(@".png")]

そしてそれを次のように使用します[UIImage imageWithName:IMAGENAME(@"architecture")];

次のように定義することもできます。

#define IMAGENAME(Name) (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)?[(Name) stringByReplacingOccurrencesOfString:@".png" withString:@"~ipad.png"]:(Name)

そしてそれを次のように使用します[UIImage imageWithName:IMAGENAME(@"architecture.png")];

別の解決策は、クラスをサブクラス化し、メソッドをUIImageオーバーライドimageWithNameして、このロジックをここに実装することです。name param で .png を検索し、iPad の場合は ~ipad.png に置き換える必要があります。その後は[UIImage imageWithName:@"architecture.png"]、iPad と iPhone の両方で直接使用できます。categoryこれは、 onNSObjectまたはを作成することによっても実現できますUIImage。これを達成する他の方法はないと思います。

于 2012-10-24T04:05:35.990 に答える