(Rather than having an overly long question with edits making a final edit for clarification, please see other edits if needed).
I have an application that is setup as follows:
InitialViewController (subclass of ECSlidingViewController)
Main Navigation Controller (subclass of UINavigationController
)
Main Home View Controller (subclass of UIViewController
)
In the viewDidLoad
of the initialViewController I load the main navigation controller in with the Home View Controller as its root.
self.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainNavVC"];
On the first load of the application the status bar and navigation bar are seperated.
This is the desired effect.
However, I then load a modal view controller and close it, using the standard methods:
[self performSegueWithIdentifier:@"LoadSelectOpponentVC" sender:self];
Then close with:
[self dismissViewControllerAnimated:YES completion:nil];
This in turn causes the main navigation controller (holding the home view controller) to display the status bar incorrectly and overlapping:
View controller-based status bar appearance
edgesForExtendedLayout
to the relevant none, but no change.I have tried to log out some frames to see where the issue occurs:
On first Load:
Main Nav VC - View Frame - {{0, 0}, {320, 480}}
Main Nav VC - Nav Bar Frame - {{0, 0}, {320, 44}} Initial VC - View Frame - {{0, 0}, {320, 480}} Home VC - View Frame - {{0, 0}, {320, 480}} -- viewDidLoad Home VC Home VC - View Frame - {{0, 64}, {320, 416}} -- viewWillAppear Home VC --- After Modal is opened/closed ---- Home VC - View Frame - {{0, 64}, {320, 416}} -- viewWillAppear Home VC Main Nav VC - View Frame - {{0, 0}, {320, 480}} -- viewWillAppear Main Nav Main Nav VC - Nav Bar Frame - {{0, 20}, {320, 44}} -- viewWillAppear Main Nav Home VC - View Frame - {{0, 44}, {320, 436}} -- viewDidAppear Home VC
Did you try Apple recommendation about "Preventing the Status Bar from Covering Your Views": https://developer.apple.com/library/content/qa/qa1797/_index.html
And did you have a look at "UIBarPositioningDelegate": https://developer.apple.com/documentation/uikit/uibarpositioningdelegate
In iOS 7.0 UIViewController
works by default this way. View will be full screen if you are using UIViewController inside UINavigationController
and the navigationBar
is visible.
If navigationBar is visible do following. ==>
self.edgesForExtendedLayout = UIRectEdgeNone
if navigationBar is hidden do following . ==>
Adjust all the UIView
elements by shifting 20 points
If you use Interface builder, you can use iOS6/7 deltas: First, "view as iOS 6.0", then set a delta of "20" to achieve the +20 offset in iOS 7
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With