It seems in iOS 6, a drop shadow is automatically added to the navigation bar even when you set a custom background image. I'm pretty sure this wasn't the case with iOS 5 as when I test the same code in the iOS 5 and 6 sim, the shadow appears in iOS 6 but not 5.
Does anyone know anything about this? Or how to enable/disable it?
Setting the shadowImage to a null image does work, however, the way the solution is presented results in adding a property if the OS is earlier than iOS 6.
A better way to do something that is dependent on the existence of a property or method is:
In Swift 3.0 this would look like this
Since
self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];
not working, I've found an easy and workable way to remove the shadow ofUINavigationBar
in both iOS 6 AND iOS 5. Hope people who need can see this post.All you have to do is prepare one background image that the height is 1 pixel larger than your navigation bar height (e.g. 320×45 for default UINavigationBar, 640×90 for 2x of course).
Then just use
[[UINavigationBar appearance] setBackgroundImage: ...]
, you will find shadow is replaced by that 1 pixel. cheers!BTW I found Twitter has done the exactly same thing, if you unzip
Twitter.ipa
and look intobg_nav_bar_events_dark.png
, the size is 320×47. They made their own shadow for 3 pixels :)I came across this SO question when trying to get nav bars to look the same between iOS6 and iOS7.
The answer I found worked was simply to use:
ie: set the shadow offset to zero.
I know this has been solved with more complicated answers above, but this is the quickest and easiest way I hid the shadow under the navigation bar.
Note from the Apple dev docs on the subject of the
shadowImage
property:So to use the nil UIImage hack you must also be setting a custom nav bar background image. This can be a nil image too, which results in a nice flat, clean 'metro' style nav bar :