Alex Rivera | Logout

Image resources for iOS

Asked 2012-09-03T08:37:55.150
29

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 someimage@2x.png, 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" ];
Edit
Report

1 Answer

1

When you are creating images for your app, let's say you're creating an image called example.

You should save the following:

  • example~iphone.png -> this is for non retina iPhone
  • example~iphone@2x.png -> this is for retina iPhone
  • example~ipad.png -> this is for non retina iPad
  • example~ipad@2x.png -> this is for retina iPad

So, it doesn't matter from where you call it, you just call it this way, assuming myImageView is a UIImageView object:

[myImageView setImage:[UIImage imageNamed:@"example"]];

Apple strongly recommends you to use png images. Also, the OS takes care of finding the correct image for the desired device. You don't need to worry about finding the path and all that stuff. +(UIImage*)imageNamed:(NSString*)name looks for the correct image in your resources bundle - and by the way, to return the bundle with your resources just call [NSBundle mainBundle];

answered 2012-09-03T08:53:55.437

Your Answer