Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't my root view's height take account of its navigation bar?

I was under the impression that a UINavigationController's navigation bar would always push down the child view's height, such that the child view's origin was at the bottom of the title bar.

But when I present a view controller like this ...

MyViewController *viewController = [[MyViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
viewController.title = @"My View Controller";
viewController.navigationItem.prompt = @"My Prompt";
viewController.delegate = self;

[self presentModalViewController:navigationController animated:YES];
[navigationController release]; [viewController release];

... and then check self.view.frame.size.height with an NSLog in viewDidLoad, it reports that my view is 460px high. Shouldn't it subtracting the height of my title & prompt?

like image 205
Ric Levy Avatar asked May 16 '11 14:05

Ric Levy


2 Answers

So, as requested:

When you call viewDidLoad the view controller hasn't been pushed onto the screen yet. So when you get the frame size from within that method it will report its' default (typically, 320x480 for an iPhone app).

The view then autoresizes to take into account the navigation bar. So when you check the frame size in viewWillAppear it will now be correct. Typically this isn't a problem for iPhone apps. For iPad apps, where you have multiple orientations, it can be a bit of a pain!

There are a few exceptions to this - for example, when using NIBs.

like image 179
lxt Avatar answered Oct 03 '22 07:10

lxt


Probably you are referring to the wrong self here. When self refers to the MyViewController instance you will probably have an height of 460 - 44 pixels (standard UIToolbar height), but if self refers to a parent view controller (e.g. the navigation view controller itself) you'll see the standard view height (e.g. 460px).

You can check this by calling self.view.frame.size.height inside the instance of MyViewController, e.g. when the view has finished loading (viewWillAppear: method), and so has already been resized by its navigation controller.

If you call self.view.frame.size.height from the viewDidLoad method, the view probably has still not been resized by its parent controller.

Please try again and let me know if this fixes your problem.

like image 34
marzapower Avatar answered Oct 03 '22 05:10

marzapower