views:

1143

answers:

2

I'm trying to display a UILabel on top of a UINavigationController. The problem is that when I add the UILabel as a subview of UIWindow it will not automatically rotate since it is not a subview of UIViewController (UIViewController automatically handles updating subviews during rotations).

This is the hierarchy I was using:

  • UIWindow
    • UILabel
    • UINavigationController

So I was thinking I could use the following hierarchy:

  • UIWindow
    • UIViewController
      • UIView
        • UILabel
        • UINavigationController

This way the label could be displayed on top of the UINavigationController's bar while also automatically being rotated since it is a subview of UIViewController.

The problem is that when I try adding a UINavigationController as a subview of a view:

[myViewController.view addSubview:myNavigationController.view];

it will appear 20 pixels downwards. Which I'm guessing is because it thinks it needs to make room for the status bar. But, since the UINavigationController is being placed inside a UIView which does not overlay on top of the status bar, it is incorrectly adding an additional 20 pixels. In other words, the top of the UINavigationBar is at the screen's 40 pixel mark instead of at 20 pixels.

Is there any easy way to just shift the UINavigationController and all of its elements (e.g. navigation bar, tool bar, root view controller) up 20 pixels? Or to let it know that it shouldn't compensate for a status bar?

If not, I guess I would need to use my first hierarchy mentioned above and figure out how to rotate the label so it is consistent with the navigation bar's rotation. Where can I find more information on how to do this?

Note: by "displaying a label on top of the navigation bar", I mean it should overlay on top of the navigation bar... it can't simply be wrapped in a bar button item and placed as one of the items of the navigation bar.

+1  A: 

Using this code seems to work:

nav.view.frame = CGRectMake(nav.view.frame.origin.x, nav.view.frame.origin.y - 20,
                          nav.view.frame.size.width, nav.view.frame.size.height);

I did this before adding the navigation controller as a subview. Using the [UIApplication sharedApplication].statusBarFrame instead of the hard coded 20 would probably be a good idea too.

I'm not sure if it's the best way to do it though.

Senseful
usenav.view.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height); to make this also work on ipad, which does not have the +20 bug but has other issues with width and height instead, overall this is a total crock, very sloppy of apple
valexa
A: 

If you want a frame representing the available content area, then you should just use: [[UIScreen mainScreen] applicationFrame]. Of course, this restricts your top-level view controller so that it can only be top level. So still kind of dodgy, but less so.

Casebash