添加UINavigationController作为UIView的子视图

时间:2010-03-26 21:51:19

标签: cocoa-touch uiview uiviewcontroller uinavigationcontroller subview

我正在尝试在UINavigationController上显示UILabel。问题是,当我将UILabel添加为UIWindow的子视图时,它不会自动旋转,因为它不是UIViewController的子视图(UIViewController在旋转期间自动处理更新子视图)。

这是我正在使用的层次结构:

  • 的UIWindow
    • 的UILabel
    • 的UINavigationController

所以我想我可以使用以下层次结构:

  • 的UIWindow
    • 的UIViewController
      • 的UIView
        • 的UILabel
        • 的UINavigationController

这样,标签可以显示在UINavigationController栏的顶部,同时也自动旋转,因为它是UIViewController的子视图。

问题在于,当我尝试添加UINavigationController作为视图的子视图时:

[myViewController.view addSubview:myNavigationController.view];

它将向下显示20个像素。我猜是因为它认为它需要为状态栏腾出空间。但是,由于UINavigationController被放置在UIView内部,而UIView没有覆盖在状态栏的顶部,因此错误地添加了另外20个像素。换句话说,UINavigationBar的顶部位于屏幕的40像素标记处而不是20像素处。

有没有简单的方法可以将UINavigationController及其所有元素(例如导航栏,工具栏,根视图控制器)移动20个像素?或者让它知道它不应该补偿状态栏?

如果没有,我想我需要使用上面提到的第一个层次结构,并弄清楚如何旋转标签,使其与导航栏的旋转一致。我在哪里可以找到有关如何执行此操作的更多信息?

注意:通过“在导航栏顶部显示标签”,我的意思是它应该叠加在导航栏的顶部...它不能简单地包裹在一个条形按钮项目中并作为其中一个放置导航栏的项目。

5 个答案:

答案 0 :(得分:18)

使用此代码似乎有效:

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);

我在将导航控制器添加为子视图之前就这样做了。使用[UIApplication sharedApplication] .statusBarFrame而不是硬编码20也可能是一个好主意。

我不确定这是不是最好的方法。

答案 1 :(得分:2)

如果您想要一个代表可用内容区域的框架,那么您应该使用:[[UIScreen mainScreen] applicationFrame]。当然,这会限制您的顶级视图控制器,使其只能是顶级视图。所以仍然有点狡猾,但不那么。

答案 2 :(得分:2)

为什么不使用App Frame而不是为原点添加一些值?我的意思是:

CGRect appFrame = [[UIScreen mainScreen] applicationFrame];

作为参考框架,并执行以下操作:

nav.view.frame = CGRectMake(appFrame.origin.x, appFrame.origin.y, ...

这个对我有用。

答案 3 :(得分:0)

我实际上遇到了同样的问题,但设法解决了这个问题。

我注意到我的视图控制器的视图具有正确的帧,但视图控制器的导航栏没有(它的帧起点为(0,20))。

将其插入到视图的控制器中,该控制器是导航控制器的超级视图:

- (void) viewDidAppear:(BOOL)animated {
    if (navigationController.navigationBar.frame.origin.y != 0) {
        [[navigationController view] removeFromSuperview];
        [[self view] addSubview:navigationController.view];
    }
}

答案 4 :(得分:0)

迅速5: 在UINavigationController的根视图控制器的viewDidLoad()中添加以下行。

self.edgesForExtendedLayout = [.top, .bottom]