iosobjective-cipadcocoa-touchiphone-6-plus

iPhone plus and iPad UIBarMetrics (different landscape/portrait images for navigation bar)


How to set 2 different (red and green for example) images for navigation bar background for landscape and portrait orientation on iPhone (6-6s-7) plus or iPad?

[[UINavigationBar appearance] setBackgroundImage:redImage
                                   forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setBackgroundImage:greenImage
                                   forBarMetrics:UIBarMetricsCompact];

Don't work for iPad or iPhone * plus, just always used redImage for both orientations. But works with all other iPhone (and even iPod i guess).

Additionally, will be great to read something about difference in bar metrics (and anything else) between iPhone and iPad / iPhone plus, cause it (nav bar background image) isn't only one thing with specific behavior on (iPhone plus, iPad) that i have realized (different separator inset's in table view, etc.).

Thank, you.


Solution

  • You can subscribe your view controller class (or other class that can control status bar) to UIApplicationDidChangeStatusBarOrientationNotification. In the handler, you should update your background image:

    <...>
    if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait ||
                [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)
        {
            image = redImage;
        }
        else
        {
            image = greenImage;
        }
    <...>
    

    You can't use UIBarMetrics for this, because your task uses interface orientation as criterion, but UIBarMetrics bases on size classes. Therefore you can't use appearance to achieve required behaviour.

    I recommend for you create custom subclass of UINavigationBar and implement that logic inside it.