web-dev-qa-db-ja.com

アセットカタログpathForResourceへのアクセス

次のように見えます:

[[NSBundle mainBundle] pathForResource:@"name" ofType:@"png"];

Images.xcassetsアセットカタログ内にあるアセットについては何も返しません。私も試しました:

[[NSBundle mainBundle] pathForResource:@"name" ofType:@"png" inDirectory:@"Images"];

[[NSBundle mainBundle] pathForResource:@"name" ofType:@"png" inDirectory:@"Images.xcassets"];

しかし、どちらも機能しませんでした。

カタログ内のアセットへのパスの取得に成功した人はいますか?

64
MobileVet

同じ問題ですが、以下を除き、pathForResource:経由でアクセスできるとは思いません。

UIImage* image = [UIImage imageNamed:@"name-in-asset-catalog"];

明確になっています 文書化

資産カタログの各セットには名前があります。その名前を使用して、セットに含まれる個々の画像をプログラムで読み込むことができます。画像を読み込むには、UIImage:imageNamed:メソッドを呼び出して、画像を含むセットの名前を渡します。

コンパイル済みアプリのパッケージで、 "Assets.car"という名前のファイルが出てきたことがわかりました。これは私のプロジェクトの画像セット全体だと思います、および圧縮されている必要がありますか何か。

Appleのドキュメントを参照してください。

Xcode 5は、プロジェクトの展開ターゲットに応じて、アセットカタログにさまざまな機能を提供します。

  • すべてのプロジェクトで、セット名を使用して個々の画像をロードできます。
  • IOS 7を展開ターゲットとするプロジェクトの場合、Xcodeはアセットカタログをランタイムバイナリファイル形式にコンパイルし、アプリのダウンロード時間を短縮します。

これで終わりです。

imageNamed:を使用しない方法も探しています。ランタイムに画像をキャッシュさせたくないのです。

25
sunnyxx
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@.png", [[NSBundle mainBundle] resourcePath], imgName]];

imgName:画像セットの名前。画像セット内の画像の実際の名前は考慮しません。

12
Lyle

ローカルリソースでUNNotificationAttachmentを作成するためにいくつかのベクターアセットにアクセスしたかったので、このヘルパークラスを思いつきました。基本的にはアセットから画像を取得し、そのデータをディスクに保存し、ファイルURLを返します。私はそれが誰かを助けることを願っています。

import UIKit

class AssetExtractor {

    static func createLocalUrl(forImageNamed name: String) -> URL? {

        let fileManager = FileManager.default
        let cacheDirectory = fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0]
        let url = cacheDirectory.appendingPathComponent("\(name).png")

        guard fileManager.fileExists(atPath: url.path) else {
            guard
                let image = UIImage(named: name),
                let data = UIImagePNGRepresentation(image)
            else { return nil }

            fileManager.createFile(atPath: url.path, contents: data, attributes: nil)
            return url
        }

        return url
    }

}
11
tadija

「資産カタログのコンパイル」ステップで決定されたイメージ名を使用してみてください。これはビルド出力にあります。必ずトランスクリプトを展開してください。次のようなものが表示されるはずです。

/* com.Apple.actool.compilation-results */
/path/to/Debug-iphonesimulator/Your.app/[email protected]
/path/to/Debug-iphonesimulator/Your.app/[email protected]
/path/to/Debug-iphonesimulator/Your.app/[email protected]
/path/to/Debug-iphonesimulator/Your.app/[email protected]
/path/to/Debug-iphonesimulator/Your.app/LaunchImage-700-Landscape~ipad.png
/path/to/Debug-iphonesimulator/Your.app/LaunchImage-700-Landscape@2x~ipad.png

Xcode 6.1.1で+[UIImage imageNamed:]を使用してテストしました。

2

そのアイテムの画像のファイル名を含むxcassetsの各アイテムに関連付けられているContents.jsonファイル(下記参照)がありますが、ファイルシステムレベルでアクセスできるようには見えません。すべての画像は、コンパイル時に単一のファイルシステムフォルダーに配置されます。 jsonファイルは自動生成されるため、編集しないでくださいが、回避策のテンプレートを提供します。

Jsonファイルに表示される対応するイディオム、スケール、およびサブタイプに一致するように、各ファイルに一貫したサフィックスを付けます。これには、各アセットの「Finderで表示」オプションを選択して各ファイルの名前を変更する手動作業が必要ですが、完了したら、pathForResourceを関数と組み合わせて使用​​し、適切なサフィックスをベースアセット名に追加して、適切に取得します-サイズの画像。

パスを取得するサンプルコード:

NSString *imageName = @"Add to Cart";
NSString *imageSuffix = [self someMethodThatDeterminesSuffix]; // Example: "-iphone-2x-retina4"
NSString *imagePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@%@", imageName, imageSuffix] ofType:@"png"];

「カートに追加」画像アセットのContents.jsonファイルの例:

{
  "images" : [
    {
      "idiom" : "iphone",
      "scale" : "1x",
      "filename" : "Add to Cart-iphone-1x.png"
    },
    {
      "idiom" : "iphone",
      "scale" : "2x",
      "filename" : "Add to Cart-iphone-2x.png"
    },
    {
      "idiom" : "iphone",
      "filename" : "Add to Cart-iphone-2x-retina4.png",
      "subtype" : "retina4",
      "scale" : "2x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}
1
Craig LaHote

特に起動画像とアプリケーションアイコンの場合、画像パスはそれぞれUILaunchImagesおよびCFBundleIcons Info.plistキーを介して利用できます。これらの画像は個別に生成され、資産カタログを使用するときにアプリのビルド中にInfo.plist値が更新されるようです(そうでない場合、これらのキーはXcode UIによって直接書き込まれます)。使用する正しいサブディクショナリを特定するためにいくつかのコードを書く必要があるかもしれませんが、画像は個別に利用でき、その場合はimageNamedの使用を避けることができます。

0
Carl Lindberg