次のように見えます:
[[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"];
しかし、どちらも機能しませんでした。
カタログ内のアセットへのパスの取得に成功した人はいますか?
同じ問題ですが、以下を除き、pathForResource:
経由でアクセスできるとは思いません。
UIImage* image = [UIImage imageNamed:@"name-in-asset-catalog"];
明確になっています 文書化 :
資産カタログの各セットには名前があります。その名前を使用して、セットに含まれる個々の画像をプログラムで読み込むことができます。画像を読み込むには、UIImage:imageNamed:メソッドを呼び出して、画像を含むセットの名前を渡します。
コンパイル済みアプリのパッケージで、 "Assets.car"という名前のファイルが出てきたことがわかりました。これは私のプロジェクトの画像セット全体だと思います、および圧縮されている必要がありますか何か。
Appleのドキュメントを参照してください。
Xcode 5は、プロジェクトの展開ターゲットに応じて、アセットカタログにさまざまな機能を提供します。
- すべてのプロジェクトで、セット名を使用して個々の画像をロードできます。
- IOS 7を展開ターゲットとするプロジェクトの場合、Xcodeはアセットカタログをランタイムバイナリファイル形式にコンパイルし、アプリのダウンロード時間を短縮します。
これで終わりです。
imageNamed:
を使用しない方法も探しています。ランタイムに画像をキャッシュさせたくないのです。
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@.png", [[NSBundle mainBundle] resourcePath], imgName]];
imgName:画像セットの名前。画像セット内の画像の実際の名前は考慮しません。
ローカルリソースで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
}
}
「資産カタログのコンパイル」ステップで決定されたイメージ名を使用してみてください。これはビルド出力にあります。必ずトランスクリプトを展開してください。次のようなものが表示されるはずです。
/* 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:]
を使用してテストしました。
そのアイテムの画像のファイル名を含む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"
}
}
特に起動画像とアプリケーションアイコンの場合、画像パスはそれぞれUILaunchImagesおよびCFBundleIcons Info.plistキーを介して利用できます。これらの画像は個別に生成され、資産カタログを使用するときにアプリのビルド中にInfo.plist値が更新されるようです(そうでない場合、これらのキーはXcode UIによって直接書き込まれます)。使用する正しいサブディクショナリを特定するためにいくつかのコードを書く必要があるかもしれませんが、画像は個別に利用でき、その場合はimageNamedの使用を避けることができます。