web-dev-qa-db-ja.com

iOSの画像リソース

私はおそらくここで明白な何かを見逃しているのですが、私は次の問題を解決できませんでした:

someimage.png[email protected]など、通常の画面と網膜画面の両方の画像リソースを使用するプロジェクトがあり、これらは別のバンドルに保存されています。プロジェクトをビルドすると、Xcodeが自動的にそれらを単一のマルチページtiff(imageName.tiff)にパックします。Finderで確認しました。実際には、両方の画像が含まれているマルチページtiffです。ただし、ここで問題が発生します。適切なリソースをロードするのに苦労しています。

私がしていることは:

    NSString * imageName = ... ;

    NSLog(@"imageName: %@", imageName);

    UIImage * someImage = [UIImage imageNamed: imageName];

また、リソースとのバンドルを返す補助メソッドも気に入っています。

   +(NSBundle *) resourcesBundle
   {
         NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"MyResourcesBundle" withExtension:@"bundle"]];
         return bundle;
   }

imageNameをフォローしてみました:

imageName = [[AuxClass resourcesBundle] pathForResource:@"someimage" ofType:@"png"];

この場合、nullimageNameを使用します。

imageName = [[AuxClass resourcesBundle] pathForResource:@"someimage" ofType:@"tiff"];

この場合、actuall画像パスが返されますが、imageWithContentsOfFileではなくimageNamedを使用した場合にのみ機能し、適切なリソースを使用しません。画面のタイプに関係なく、網膜のリソースをロードします。

ファイルタイプを省略した場合(@2xリソースを追加する前に行ったように、正常に機能し、最初に試してみて、機能することを確認した場合)

imageName = [NSString stringWithFormat: @"%@/%@",
                                  @"MyResourcesBundle.bundle"",
                                  @"someimage" ];

何も読み込まれません。

「.tiff」拡張子を追加すると、pathForResource:と同じ効果が得られます。網膜以外の画面のリソースは無視され、網膜のリソースが読み込まれます。

それで私は何が欠けているのですか?画像をロードする正しい方法は何ですか?

28
Vladimir

以下を使用して画像を単にロードしようとしましたか?

UIImage * someImage = [UIImage imageNamed: @"someimage"];

(プロジェクトに「someimage」という名前のイメージがあると仮定します。たとえば、someimage.png)

コードは、プラットフォームに応じて、網膜/非網膜バージョンを自動的に選択します。

TIFFが作成されていることが問題である場合は、以下を確認してください。

XCode Combine high-resolution artwork

XCodeの最新バージョンでは、[エディター]メニューに移動し、[設定の検証]を選択すると、そのアートワークの組み合わせが削除されます。

46
Resh32

マルチページTIFFはOSX専用です。iOSでは機能しません

したがって、本来その性質上、アクセスできないリソースにアクセスしようとするのをやめて、正しいことをする必要があります。

外部リソースバンドルを生成するプロジェクトを開き、ターゲットを選択し、[ビルド設定]に移動してから[展開]サブ見出しに移動し、[高解像度アートワークの結合]をいいえ。次に、外部リソースバンドルを再コンパイルします。

メインプロジェクトでは、通常の方法でPNGを読み取ることができるはずです。

11
Wildaker

バンドルを使用している場合は、

->ビルド設定-> COMBINE_HIDPI_IMAGESをNOに、

クリーンアップしてビルドするだけです!

8
casero

->ビルド設定-> COMBINE_HIDPI_IMAGESをNOに

これが機能する唯一のソリューションであり、他の変更は必要ありません

2
user2587835

アプリのイメージを作成するときに、exampleというイメージを作成するとします。

以下を保存する必要があります。

  • example〜iphone.png->これは網膜以外のiPhone用です
  • [email protected]>これはRetina iPhone用です
  • example〜ipad.png->これは非網膜iPad用です
  • [email protected]>これはRetina iPad用です

したがって、myImageViewがUIImageViewオブジェクトであると想定して、どこから呼び出すかは問題ではなく、次のように呼び出すだけです。

_[myImageView setImage:[UIImage imageNamed:@"example"]];
_

Appleはpng画像を使用することを強くお勧めします。また、OSは目的のデバイスに適した正しい画像を見つけるように処理します。パスやそのすべてを見つけることについて心配する必要はありません。 +(UIImage*)imageNamed:(NSString*)nameは、リソースバンドルで正しい画像を探します-ちなみに、リソースとともにバンドルを返すには、_[NSBundle mainBundle];_を呼び出します

1
Natan R.