Cocoa touch 添加UINavigationController作为UIView的子视图

Cocoa touch 添加UINavigationController作为UIView的子视图,cocoa-touch,uiview,uiviewcontroller,uinavigationcontroller,subview,Cocoa Touch,Uiview,Uiviewcontroller,Uinavigationcontroller,Subview,我试图在UINavigationController上显示UILabel。问题是,当我将UILabel添加为UIWindow的子视图时,它不会自动旋转,因为它不是UIViewController的子视图(UIViewController会在旋转期间自动处理更新子视图) 这是我使用的层次结构: UIWindow UILabel 导航控制器 所以我想我可以使用以下层次结构: UIWindow UIViewController UIView UILabel 导航控制器 这样,标

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

这是我使用的层次结构:

  • UIWindow
    • UILabel
    • 导航控制器
所以我想我可以使用以下层次结构:

  • UIWindow
    • UIViewController
      • UIView
        • UILabel
        • 导航控制器
这样,标签可以显示在UINavigationController的栏顶部,同时也可以自动旋转,因为它是UIViewController的子视图

self.edgesForExtendedLayout = [.top, .bottom]
问题是,当我尝试将UINavigationController添加为视图的子视图时:

[myViewController.view addSubview:myNavigationController.view];
它将向下显示20个像素。我猜这是因为它认为它需要为状态栏腾出空间。但是,由于UINavigationController被放置在未覆盖在状态栏顶部的UIView中,因此它错误地添加了额外的20个像素。换句话说,UINavigationBar的顶部位于屏幕的40像素标记处,而不是20像素处

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

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


注意:通过“在导航栏顶部显示标签”,我的意思是它应该覆盖在导航栏顶部。。。它不能简单地包装在一个工具栏按钮项目中,并作为导航栏的一个项目放置。

使用此代码似乎有效:

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可能也是一个好主意


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

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

为什么不使用App Frame,而不是向origins添加一些值呢?我的意思是使用:

CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
作为参考框架,并执行以下操作:

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

这一个对我有效。

实际上我也有同样的问题,但还是设法解决了

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

将其插入作为导航控制器超级视图的视图控制器:

- (void) viewDidAppear:(BOOL)animated {
    if (navigationController.navigationBar.frame.origin.y != 0) {
        [[navigationController view] removeFromSuperview];
        [[self view] addSubview:navigationController.view];
    }
}
Swift 5: 在UINavigationController的根视图控制器的
viewDidLoad()
中添加以下行

self.edgesForExtendedLayout = [.top, .bottom]

使用nav.view.frame=CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);为了使这一点在ipad上也能起作用,ipad没有+20错误,但在宽度和高度方面存在其他问题,总体而言,这是一个完全无用的应用程序,非常松散。我有一个例子,如果我在ipad上以横向模式加载UINavigationController视图作为子视图,我确实会遇到20像素的错误。但这只是第一次。我可以稍后将重新添加到superview,问题将消失。非常非常令人沮丧。看来我也有同样的问题。没有任何东西真正告诉我导航栏的垂直偏移量为20像素@DanielWood我真的和你一样沮丧。如果我按下然后弹出另一个控制器,一切正常,但第一次。。。我尝试一下你的玩法。我认为“我在将导航控制器添加为子视图之前做了这件事”这句话应该用粗体、红色、带下划线的字体书写——对我来说,这是解决20像素问题最关键的部分。当我在将导航视图添加为子视图之前设置导航视图的框架时,问题就消失了:)这应该可以解决在父子视图上多次重新加载navigaitonView的问题。