Monthly Archives: October 2011

Making UIBarButtonItems in Photoshop

Recently I was working on an app that required brightly tinted tool bars and navigation bars:

A UIToolBar with a light blue tint color

As you can see, the light blue color makes the bar button hard to see and its label hard to read. Changing the background color of the button is really easy on iOS 5 because its UIBarButtonItem also has a .tintColor property. But if you still need to support iOS 4 then you’re out of luck.

In that case, the only solution is to put a UIButton inside the UIBarButtonItem and give it a background image that looks like a regular bar button. It’s a roundabout way of doing things but it works.

Previously, I would draw these bar button-lookalike images myself in Photoshop. By setting the appropriate layer styles on a rounded rectangle vector object you can make a decent approximation of what a real bar button item looks like.

This time, however, I wanted to take advantage of the actual images that UIKit itself uses to compose the UIBarButtonItem when you change the tintColor of the underlying toolbar or navigation bar.

To pull this off, you can download UIKit Artwork Extractor. Compile the app and run it on the Simulator (or on your device). It will extract all the images that are built into the various iPhone and iPad frameworks and save them to a folder on your computer.

After you have extracted the images, go into the “Shared” subfolder and look for:

  • UITintedButtonHighlight.png
  • UITintedButtonMask.png
  • UITintedButtonShadow.png

You can combine these three images with a fill color to produce a tinted UIBarButtonItem background image, like this:

How to add the different images to produce the final bar button image

The actual layers pane should look like this:

The Layers pane in Photoshop

The “Fill color” layer is simply a rectangle filled with the tint color that you want the button to have. As you can see, both the fill layer and the “shadow” layer are clipped against the red “mask” layer. If you don’t do that, the button won’t have a transparent background in the corners.

To export the image, merge all the visible layers (but not the background!) and save the image as PNG. This gives you a 11×30 pixels stretchable image.

You can use the following category to create the fake bar button items in your code. It requires that the image named “BarButton.png” is added to your project.

@implementation UIBarButtonItem (FakeButtons)
 
- (id)initWithTitle:(NSString *)title width:(CGFloat)width target:(id)target action:(SEL)action
{
	UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
	[button setTitle:title forState:UIControlStateNormal];
	[button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
	button.titleLabel.font = [UIFont boldSystemFontOfSize:12];
	button.titleLabel.shadowColor = [UIColor colorWithWhite:0 alpha:0.5];
	button.titleLabel.shadowOffset = CGSizeMake(0, -1);
	button.frame = CGRectMake(0, 0, width, 30);
 
	UIImage *image = [[UIImage imageNamed:@"BarButton"] stretchableImageWithLeftCapWidth:5 topCapHeight:0];
	[button setBackgroundImage:image forState:UIControlStateNormal];
 
	return (self = [self initWithCustomView:button]);
}
 
@end

In the “Shared” folder you will also find images for the UINavigationController back button (named UITintedBackButtonXXX.png), but be advised that bar button items with a custom view won’t work on UINavigationItem’s backBarButtonItem property. You’ll have to put your custom back button on leftBarButtonItem instead.

Tip: If you also want to have Retina-sized images, run Artwork Extractor on a Retina device or on the Simulator in Retina mode. It’s very enlightening to look through the rest of the extracted artwork as well.

Get up-to-date on iOS 5 with the iOS 5 By Tutorials ebook

Now that iOS 5 is out and the NDA has been lifted, we can finally talk in public about all the new features in the SDK. And there is a lot to talk about!

Together with the other members of the RayWenderlich.com Tutorial Team I’ve been hard at work these past weeks putting together an ebook that goes in-depth on many of the new technologies in iOS 5.

I contributed four chapters on Automatic Reference Counting (ARC) and Storyboards, and the book is packed with other cool stuff as well.

Some of the topics covered: iCloud, OpenGL ES 2.0 with GLKit, Newsstand, UIKit customization, using the new integrated Twitter, Turn Based Gaming with Game Center, Core Image, and much more!

Because we had to rush a bit to get it out in time, the book is currently available as a beta version. It’s already 600 pages and there are many more goodies coming. If you get the book now, you’ll receive the new chapters as they become available.

I’m really excited about this ebook. It’s a goldmine of information and I can’t wait to read it myself! Check it out at www.raywenderlich.com.

The iOS Apprentice is available too!

Speaking of ebooks, I’m happy to announce that as of today the next two parts of my beginner course The iOS Apprentice are available as well.

This course is a series of epic-length tutorials that take you from zero to writing real apps for the iPhone and iPad. It’s aimed at complete beginners and people who have experience with other languages (PHP, Java, C#) but who are new to the platform.

If you’re confused about what a delegate or a view controller is, or if the strange syntax of Objective-C scares you, then you need to get this ebook!

You can read the first part for free when you sign up for Ray’s Monthly Newsletter at www.raywenderlich.com, so check it out and let me know what you think. If you liked the first part, you’re going to love the rest of The iOS Apprentice. :-)

The iOS Apprentice preview

Good Software

Good Software…

Is instantaneous, it doesn’t make me wait.

Remembers things for me.

Draws intelligent conclusions based on my past behavior and correctly predicts what I want to do next.

Allows me to make mistakes and experiment.

Is predictable, it should not confuse me by doing something I did not expect.

Is dependable, it does not lose or corrupt my data.

Is polite, it doesn’t interrupt me.

Gets out of my way.

Puts my needs first, not those of the computer or the developer (or publisher/brand/investor/sponsor).

Is an extension of me, not another burden to carry.

Makes my life easier, not more frustrating.

Is smart, it does not require me to hold its hand all the time.

Should shape itself to my perception of reality.

(We have a long way to go still!)