Image resources for iOS

Vladimir picture Vladimir · Sep 3, 2012 · Viewed 22.9k times · Source

I'm probably missing something obvious here, yet I've been unable to solve the following problem:

I have a project with image resources for both normal and retina screens, like someimage.png and [email protected], which are stored in a separate bundle. When I build the project, Xcode automatically packs them into a single multipage tiff (imageName.tiff), I've checked it in finder - it is actually multipage tiff with both images. However, here comes a problem: I struggle to load appropriate resource.

What I do is:

    NSString * imageName = ... ;

    NSLog(@"imageName: %@", imageName);

    UIImage * someImage = [UIImage imageNamed: imageName];

Also I fave auxiliary method, which returns bundle with resources:

   +(NSBundle *) resourcesBundle
   {
         NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"MyResourcesBundle" withExtension:@"bundle"]];
         return bundle;
   }

I've tried following for imageName:

imageName = [[AuxClass resourcesBundle] pathForResource:@"someimage" ofType:@"png"];

in this case i have null for imageName.

imageName = [[AuxClass resourcesBundle] pathForResource:@"someimage" ofType:@"tiff"];

in this case actuall image path is returned, however it only works if I use imageWithContentsOfFile instead of imageNamed, and it doesn't take appropriate resource: it loads resource for retina despite the type of screen.

If I ommit filetype (as I did before adding @2x resources, and it worked ok, and was the first thing I tried and was sure it would work)

imageName = [NSString stringWithFormat: @"%@/%@",
                                  @"MyResourcesBundle.bundle"",
                                  @"someimage" ];

nothing get's loaded.

Adding ".tiff" extension have the same effect as pathForResource: - resource for retina is loaded, disregarding resource for non-retina screen.

So what am I missing? What's the correct way of loading images?

Answer

Resh32 picture Resh32 · Sep 3, 2012

Have you tried to simply load the image using:

UIImage * someImage = [UIImage imageNamed: @"someimage"];

(assuming your have an image named 'someimage' in you project, for example someimage.png)

The code will automatically pick retina/non-retina versions depending on the platform.

If the problem is that the TIFF are created, check:

XCode Combine high-resolution artwork

In latest version of XCode, go to the Editor menu, then select "validate settings", which should remove that artwork combination.