12

これについていくつかの議論があったことは知っていますが、良い答えが見つかりませんでしたか?

私の質問は -

  1. そんなこと知ってる -

      [UIImage imageNamed:@"blabla"]
    

iPhoneに表示する正しい画像(Retinaかどうか)を自動的に検索します。

私はユニバーサルアプリを持っています.ipadで@2xバージョンを使用したいので、他のバージョンの画像をロードする必要はありません(何百もの小さな画像があります)。

出来ますか ?

  • Apple は iPhone と iPad 用に別々のアプリを構築することを好むため、ユニバーサル アプリを思いとどまらせると人々が書いている場所をいくつか見ました。それぞれに異なる UI を作成しても、それは正しいですか?

ありがとう

シャニ

4

4 に答える 4

66

「image」という名前の画像をロードしている場合、検索パスはこれまでと同じになる可能性があります。

iPhone:

  • 1) image@2x~iphone.png (網膜のみ)
  • 2) image@2x.png (網膜のみ)
  • 3) 画像~iphone.png
  • 4) 画像.png

iPad:

  • 1) image@2x~ipad.png (網膜のみ)
  • 2) image@2x.png (網膜のみ)
  • 3) image~ipad.png
  • 4) 画像.png
于 2012-03-09T01:40:59.363 に答える
17

高解像度の iPhone Retina イメージを iPad 用に複製しないようにする、組み込みの適切な方法はありません。ユーザー インターフェイス イディオム マクロを使用してプラットフォームを決定する独自の UIImage 拡張機能またはサブクラスを作成し、画像名に "@2x" を自動的に追加することができます。

+ (UIImage *) imageNamedSmart:(NSString *)name
{
    if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
        return [UIImage imageNamed:[NSString stringWithFormat:@"%@@2x.png", name]];
    return [UIImage imageNamed:[NSString stringWithFormat:@"%@.png", name]];
}

次のように呼び出します。

[UIImage imageNamedSmart:@"myImage"]
于 2011-02-23T10:01:32.980 に答える
3

網膜画像が存在するかどうかを確認することで、Bogatyr の回答を改善しました。あまり必要ではないかもしれませんが、テストの際に役立つので、1 つのイメージ ファイルを作成するだけで済みます。

+ (UIImage *) imageNamedSmart:(NSString *)name {
    NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease];
    NSString *retinaFileName = [NSString stringWithFormat:@"%@@2x", name];

    NSString *filePath = [[NSBundle mainBundle] pathForResource:retinaFileName ofType:@"png"];

    if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && [fileManager fileExistsAtPath:filePath]) {
        return [UIImage imageNamed:[retinaFileName stringByAppendingString:@".png"]];
    }
    return [UIImage imageNamed:[NSString stringWithFormat:@"%@.png", name]];
}
于 2011-12-21T23:47:25.533 に答える
0

たぶん、すべての画像リソースimage@2x.pngをimage〜ipad.pngに複製することができます。「〜ipad.png」の場合はご注意ください。ただし、Cap(stretchableImageWithLeftCapWidth:topCapHeight:)を使用してストレッチ画像を手動で管理する必要があります。

于 2011-10-11T12:48:21.857 に答える