28

ここで明らかな何かが欠けている可能性がありますが、次の問題を解決できませんでした。

someimage.pngsomeimage@2x.pngなど、通常の画面と網膜画面の両方の画像リソースを含むプロジェクトがあり、これらは別のバンドルに保存されています。プロジェクトをビルドすると、Xcode はそれらを単一のマルチページ tiff ( imageName.tiff) に自動的にパックします。ファインダーで確認しました。実際には、両方の画像を含むマルチページ 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"];

この場合、私はnullfor を持っていimageNameます。

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

この場合、実際の画像パスが返されますが、imageWithContentsOfFile代わりにを使用した場合にのみ機能imageNamedし、適切なリソースを使用しません。画面の種類に関係なく、Retina のリソースをロードします。

ファイルタイプを省略した場合(@2xリソースを追加する前に行ったように、問題なく機能し、最初に試して、機能すると確信していました)

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

何も読み込まれません。

pathForResource:「.tiff」拡張子を追加すると、非網膜画面のリソースを無視して、網膜のリソースが読み込まれるのと同じ効果があります。

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

4

5 に答える 5

46

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

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

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

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

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

XCode 結合高解像度アートワーク

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

于 2012-09-03T08:49:02.523 に答える
11

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

そのため、本質的にアクセスできないリソースにアクセスしようとするのをやめ、正しい方法で物事を行う必要があります。

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

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

于 2012-09-03T09:52:32.010 に答える
10

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

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

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

于 2013-04-10T10:07:14.240 に答える
1

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

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

  • example~iphone.png -> 非 Retina iPhone 用
  • example~iphone@2x.png -> これは Retina iPhone 用です
  • example~ipad.png -> これは非 Retina iPad 用です
  • example~ipad@2x.png -> これは Retina iPad 用です

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

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

Apple では、png 画像を使用することを強く推奨しています。また、OS は、目的のデバイスの正しいイメージを見つけます。パスの検索などについて心配する必要はありません。+(UIImage*)imageNamed:(NSString*)nameリソース バンドル内の正しいイメージを探します。ちなみに、リソースを含むバンドルを返すには、次のように呼び出します。[NSBundle mainBundle];

于 2012-09-03T08:53:55.437 に答える