web-dev-qa-db-ja.com

iOSのバンドルから画像を読み込む

プロジェクトに.bundleフォルダーを追加し、いくつかの画像を入れました。次のようなものを直接書いているこの画像を参照するのは正しいですか?:

[UIImage imageNamed:@"imageInBundle.png"];

これらの画像にアクセスして使用する最良の方法はどれですか?

59
MatterGoal

それは正しいです、 imageNamed:はメインバンドルを検索します。プロジェクト内の画像は、Project Navigatorの異なるグループにある場合でもメインバンドルに含まれ、名前で直接アクセスできます。

48
Joe

それでもうまくいかない場合は、試してください

[UIImage imageNamed:@"yourbundlefile.bundle/imageInBundle.png"];

ベスト

54
Ignacio Pascual

1)バンドルを使用している場合は、バンドルターゲットに移動し、COMBINE_HIDPI_IMAGESをNOに設定します。別のケースでは、画像はtiff形式に変換されます。

2)このコードを試してください:

NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"YourBundle" withExtension:@"bundle"]];
NSString *imagePath = [bundle pathForResource:@"imageInBundle" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
26
user1794139

AppleはiOS 8でこのための適切なAPIを提供してくれました。imageNamed:inBundle:compatibleWithTraitCollection:

次のように使用されます:

[UIImage               imageNamed:@"image-name"
                         inBundle:[NSBundle bundleForClass:self.class]
    compatibleWithTraitCollection:nil]

またはSwiftで:

let image = UIImage(named: "image-name",
                    inBundle: NSBundle(forClass: self),
                    compatibleWithTraitCollection: nil)
19
JosephH

このメソッドは、xcodeプロジェクトの任意の場所に画像を返します:=>

+(UIImage*)returnImageFromResourceBundle:(NSString*)nameOfImage
{
    NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"Resource" ofType:@"bundle"];
    NSString *imageString = [[NSBundle bundleWithPath:bundlePath] pathForResource:nameOfImage ofType:@"png"];

    UIImage *retrievedImage = [[UIImage alloc] initWithContentsOfFile: imageString];
    return retrievedImage;
}
7
Mohd. Asif

Swift

let myImage = UIImage(named: "nameOfImage", in: Bundle(for: type(of: self)), compatibleWith: nil)

現在のバンドルを取得できないので、これを行います:

Bundle(for: type(of: self))
6
oscarr

Swift 3

let prettyImage = UIImage(named: "prettyImage",
            in: Bundle(for: self),
            compatibleWith: nil)
5
Pavle Mijatovic

私はSwiftでこれを把握しなければならなかったので、私も追加すると思いました...

if let imagePath = NSBundle.mainBundle().pathForImageResource("TestImage.png")     
{
    imageView.image = NSImage(contentsOfFile: imagePath)
}

私が持っている場所TestImage.png の中に Supporting Filesバンドル内のグループ。

5

Swiftバージョン

@AndrewMackenzieの答えはうまくいきませんでした。これが機能しました

let image = UIImage(named: "imageInBundle.png")
imageView.image = image

私の完全な答えは here です。

4
Suragch

同じviewControllerで数回使用する場合の簡単な方法:

以下のメソッドと同じクラスの任意の場所で画像を取得します:

// this fetches the image from: MyBundle.bundle/folder/to/images/myImage.png
UIImage *myImage = [self imageFromBundle:@"MyBundle" withPath:@"folder/to/images/myImage.png"];

画像を取得する方法:

- (UIImage *)imageFromBundle:(NSString *)bundleName withPath:(NSString *)imageName
{
    NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:bundleName withExtension:@"bundle"];
    NSBundle *bundle = [NSBundle bundleWithURL:bundleURL];
    NSString *imagePath = [bundle pathForResource:imageName ofType:nil];
    UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
    return image;
}

または単にバンドルから直接呼び出す:

UIImage *myImage = [UIImage imageNamed:@"MyBundle.bundle/folder/to/images/myImage.png"];
2
emotality