View got hidden below UINavigationBar iOS 7

IphoneIosUiviewIos7Navigationbar

Iphone Problem Overview


Earlier, I was using iOS 6.1 for my project. Recently I have switched to iOS 7. For, a lot of changes I knew, I updated my code.. But I have observed a strange behavior. My view on every screen gets hidden below navigation bar. Repositioning view solves the problem for iOS7, but creates problems for older iOS versions.

Can anyone explain me, what is the reason and why does it happen?? What has been changed in iOS 7 that's causing this problem??

Any help would be appreciated..

Iphone Solutions


Solution 1 - Iphone

Try navigationBar.translucent = NO;, It is YES by default in iOS7.

It is also good to take a look on this part of UINavigationBar documentation:

> New behavior on iOS 7. Default is YES. You may force an opaque > background by setting the property to NO. If the navigation bar has a > custom background image, the default is inferred from the alpha values > of the image—YES if it has any pixel with alpha < 1.0 If you send > setTranslucent:YES to a bar with an opaque custom background image it > will apply a system opacity less than 1.0 to the image. If you send > setTranslucent:NO to a bar with a translucent custom background image > it will provide an opaque background for the image using the bar's > barTintColor if defined, or black for UIBarStyleBlack or white for > UIBarStyleDefault if barTintColor is nil.

Edit:

Setting 'navigationBar.translucent' value causes exception if you run project in devices/simulators having older iOS versions.

So you can add a version check like this:

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0)
{
    navigationBar.translucent = NO;
}

Another option would be to set:

vc.edgesForExtendedLayout = UIRectEdgeNone;

Swift 3:

vc.edgesForExtendedLayout = []

Solution 2 - Iphone

You can stop your views going under the navigation bar, in your viewController:

self.edgesForExtendedLayout = UIRectEdgeNone;

Solution 3 - Iphone

Swift 3+:

self.edgesForExtendedLayout = []

Solution 4 - Iphone

If you do not need translucent navigation bar in your app you can fix this on iOS7 and iOS6 without code changes.

In storyboard select your navigation controller and then open "Attributes Inspector". Then under "Simulated Metrics" set "Top Bar" to some value but not to "translucent":

Setting Top Bar style

Now your views on iOS6 and iOS7 will have the same positioning as before.

Solution 5 - Iphone

Point #7 on [this list][1] does the trick. You still have to wrap it in iOS 7-checking code like @null's answer:

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0) {
    viewController.edgesForExtendedLayout = UIRectEdgeNone;
}

The whole article is useful to those transitioning to iOS 7.

[1]: http://blog.jaredsinclair.com/post/61507315630/wrestling-with-status-bars-and-navigation-bars-on-ios-7 "this list"

Solution 6 - Iphone

Use this property for your VC, in-order to avoid overlap of ur statusbar with your VC Swift :

self.edgesForExtendedLayout = []

Objective C

self.edgesForExtendedLayout = UIRectEdgeNone;

Solution 7 - Iphone

Look up this key: UIViewControllerBasedStatusBarAppearance.

It's used in your app's info PLIST file and will come up as:

> View controller-based status bar appearance

This will allow you to control the status bar's appearance. There's a bunch of API changes for status bars, go have a look in the documentation for new UIViewController methods such as

- (void)prefersStatusBarHidden;

Solution 8 - Iphone

In Swift 2.2, use

self.edgesForExtendedLayout = .None

Solution 9 - Iphone

For me the best way for transparent Navigation Bar is to change the shadowImage and backgroundImage of the bar.

navigationController?.navigationBar.isTranslucent = true
navigationController?.navigationBar.backgroundColor = nil
navigationController?.navigationBar.setBackgroundImage(UIImage(named: "navBarBackground")?.resizableImage(withCapInsets: .zero, resizingMode: .stretch), for: .default)  
navigationController?.navigationBar.shadowImage = UIImage()

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSalman ZaidiView Question on Stackoverflow
Solution 1 - IphoneTarek HallakView Answer on Stackoverflow
Solution 2 - IphoneDaniel BroadView Answer on Stackoverflow
Solution 3 - IphoneDavid SeekView Answer on Stackoverflow
Solution 4 - IphonegladimdimView Answer on Stackoverflow
Solution 5 - IphoneLawrence KestelootView Answer on Stackoverflow
Solution 6 - IphoneAshView Answer on Stackoverflow
Solution 7 - IphoneGuy KogusView Answer on Stackoverflow
Solution 8 - IphonematthewView Answer on Stackoverflow
Solution 9 - Iphonesaltwat5rView Answer on Stackoverflow