UINavigationBar and new iOS 5+ appearance API - how to supply two background images?

Mark Beaton picture Mark Beaton · Oct 14, 2011 · Viewed 11.2k times · Source

I want to exploit the new iOS 5 appearance API to supply custom background images to all UINavigationBar instances in my app. To do this, it's as simple as this:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"whatever.png"] forBarMetrics:UIBarMetricsDefault];

However, for each instance, I want to provide a different image depending on the value of the translucent property, e.g.

// For UINavigationBar instances where translucent returns YES:
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"whatever-translucent.png"] forBarMetrics:UIBarMetricsDefault];

// Otherwise:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"whatever.png"] forBarMetrics:UIBarMetricsDefault];

Given that the appearance APIs seem to be configured using class methods, is something like this possible?

Answer

bryanmac picture bryanmac · Oct 14, 2011

You can either set it globally with the class appearance proxy or set it on an instance of a navBar.

I'm currently setting background on an instance of the nav bar and it seems to be working. I have two different navBars with different backgrounds. If you set it on an instance, you should be able to condition the code.

UINavigationController *myNavController = [[UINavigationController alloc] initWithRootViewController:myView];
[viewControllers addObject:myNavController];

// not supported on iOS4
UINavigationBar *navBar = [myNavController navigationBar];
if ([navBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)])
{
    // right here, you could condition bg image based on properties of this instance
    // of the navBar or any other condition.

    [navBar setBackgroundImage:[UIImage imageNamed:@"bg.jpg"] forBarMetrics:UIBarMetricsDefault];
}

If you want to set using the class method, you can set for all:

[[UINavigationBar appearance] setBackground ...

I will admit though that it's pretty new and I'm just figuring it out like most folks.