I added to my project a .bundle
folder filled with some images.
Is it correct refer to this image directly writing something like ?:
[UIImage imageNamed:@"imageInBundle.png"];
Which is the best method to access and use these images ?
I added to my project a .bundle
folder filled with some images.
Is it correct refer to this image directly writing something like ?:
[UIImage imageNamed:@"imageInBundle.png"];
Which is the best method to access and use these images ?
If that does not work, try
[UIImage imageNamed:@"yourbundlefile.bundle/imageInBundle.png"];
Best
That is correct, imageNamed:
will search your main bundle. Images in your project, even if they are in different groups in your Project Navigator will be in your main bundle and can be accessed directly by name.
Apple has thankfully provided a proper API for this from iOS 8 onwards, imageNamed:inBundle:compatibleWithTraitCollection:
.
It's used like so:
[UIImage imageNamed:@"image-name"
inBundle:[NSBundle bundleForClass:self.class]
compatibleWithTraitCollection:nil]
or in swift:
let image = UIImage(named: "image-name",
inBundle: NSBundle(forClass: type(of:self)),
compatibleWithTraitCollection: nil)
or in swift 5:
let image = UIImage(named: "image-name",
in: Bundle(for: type(of:self)),
compatibleWith: nil)
1) If you are working with bundles go to bundle target and set COMBINE_HIDPI_IMAGES to NO. In another case the image will be converted to tiff format.
2) try this code:
NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"YourBundle" withExtension:@"bundle"]];
NSString *imagePath = [bundle pathForResource:@"imageInBundle" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
Swift 3
let myImage = UIImage(named: "nameOfImage", in: Bundle(for: type(of: self)), compatibleWith: nil)
I can't get current bundle so i do this:
Bundle(for: type(of: self))
You'll need to follow these steps:
Below is an example of how to do it:
Swift Code
**
func getImageFromResourceBundle(named imageName: String) -> UIImage? {
// Replace "ImageResourcesBundle" with the name of your resource bundle.
guard let bundleURL = Bundle.main.url(forResource: "ImageResourcesBundle", withExtension: "bundle"),
let resourceBundle = Bundle(url: bundleURL) else {
return nil
}
// Load the image from the resource bundle.
return UIImage(named: imageName, in: resourceBundle, compatibleWith: nil)
}
Objective C Code
+(UIImage*) getImageFromResourceBundle:(NSString*) imageName
{
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;
}
You can then call this function to get the image from the resource bundle:
if let image = getImageFromResourceBundle(named: "imageName") {
// Do something with the image.
} else {
// The image couldn't be loaded.
}
Since I had to figure this out for Swift, thought I would add also....
if let imagePath = NSBundle.mainBundle().pathForImageResource("TestImage.png")
{
imageView.image = NSImage(contentsOfFile: imagePath)
}
Where I have TestImage.png
in the Supporting Files
group inside my bundle.
For Swift 3
let prettyImage = UIImage(named: "prettyImage",
in: Bundle(for: self),
compatibleWith: nil)
A quick way to do it if you are going to use it a couple of times in the same viewController:
Get the image anywhere in the same class as the method below:
// this fetches the image from: MyBundle.bundle/folder/to/images/myImage.png
UIImage *myImage = [self imageFromBundle:@"MyBundle" withPath:@"folder/to/images/myImage.png"];
Method that fetches the 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;
}
Or simply call it straight out of the bundle:
UIImage *myImage = [UIImage imageNamed:@"MyBundle.bundle/folder/to/images/myImage.png"];
If you are building a framework and you would like all instances of UIImage(named: "image")
to always use your custom bundle, you can make an extension like below that will override it
// Swift 5
extension UIImage {
convenience init?(named: String) {
self.init(named: named, in: <#Your Bundle#>, compatibleWith: nil)
}
}
This is worked for me in Swift 5
// Empty UIImage array to store the images in it.
var icons = [UIImage]()
let fileManager = FileManager.default
let bundleURL = Bundle.main.bundleURL
let assetURL = bundleURL.appendingPathComponent("MyBundle.bundle") // Bundle URL
do {
let contents = try fileManager.contentsOfDirectory(at: assetURL,
includingPropertiesForKeys: [URLResourceKey.nameKey, URLResourceKey.isDirectoryKey],
options: .skipsHiddenFiles)
for item in contents { // item is the URL of everything in MyBundle imgs or otherwise.
let image = UIImage(contentsOfFile: item.path) // Initializing an image
icons.append(image!) // Adding the image to the icons array
}
}
catch let error as NSError {
print(error)
}
I found this question when trying to solve loading images from Swift Package, so if anybode else is struggling with that as well here's how I solved it:
let image = UIImage(named: "imageName", in: Bundle.module, compatibleWith: nil)