添加UINavigationController作为UIView的子视图

Sen*_*ful 13 cocoa-touch subview uiviewcontroller uiview uinavigationcontroller

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

这是我使用的层次结构:

  • 的UIWindow
    • 的UILabel
    • UINavigationController的

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

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

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

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

[myViewController.view addSubview:myNavigationController.view];
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Sen*_*ful 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);
Run Code Online (Sandbox Code Playgroud)

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

我不确定这是否是最好的方法.

  • 使用nav.view.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height); 使这也适用于ipad,它没有+20错误,但有宽度和高度的其他问题,总体而言,这是一个总缸,非常马虎的苹果 (5认同)
  • 我有一个实例,如果我在iPad上以横向模式加载UINavigationController视图作为子视图,我会得到20像素的错误.但只是第一次.我可以稍后重新添加到superview,问题就会消失.非常非常令人沮丧. (2认同)