web-dev-qa-db-fra.com

Charger l'image à partir d'un ensemble avec iOS

J'ai ajouté à mon projet un .bundle dossier rempli d'images. Est-il correct de se référer à cette image en écrivant directement quelque chose comme?:

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

Quelle est la meilleure méthode pour accéder et utiliser ces images?

59
MatterGoal

C'est vrai, imageNamed: recherchera votre forfait principal. Les images de votre projet, même si elles sont dans des groupes différents dans votre navigateur de projet, seront dans votre ensemble principal et accessibles directement par leur nom.

48
Joe

Si cela ne fonctionne pas, essayez

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

Meilleur

54
Ignacio Pascual

1) Si vous travaillez avec des bundles, accédez à la cible du bundle et définissez COMBINE_HIDPI_IMAGES sur NO. Dans un autre cas, l'image sera convertie au format tiff.

2) essayez ce code:

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 a heureusement fourni une API appropriée pour cela dans iOS 8, imageNamed:inBundle:compatibleWithTraitCollection:.

Il est utilisé comme ceci:

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

ou en Swift:

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

Cette méthode renvoie l'image n'importe où dans le projet 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)

Je ne peux pas obtenir le pack actuel, alors je fais ceci:

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

Pour Swift 3

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

Comme je devais comprendre cela pour Swift, j'ai pensé ajouter aussi ...

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

Où j'ai TestImage.png dans le Supporting Files groupe dans mon forfait.

5
Andrew Mackenzie

Version Swift

@ La réponse d'AndrewMackenzie ne m'a pas fonctionné. C'est ce qui a fonctionné

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

Ma réponse complète est ici .

4
Suragch

Un moyen rapide de le faire si vous comptez l'utiliser plusieurs fois dans la même vueController:

Obtenez l'image n'importe où dans la même classe que la méthode ci-dessous:

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

Méthode qui récupère l'image:

- (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;
}

Ou appelez-le simplement directement du bundle:

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