13

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

这是我使用的层次结构:

  • 界面窗口
    • UIL标签
    • UINavigationController

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

  • 界面窗口
    • UIViewController
      • 界面视图
        • UIL标签
        • UINavigationController

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

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

[myViewController.view addSubview:myNavigationController.view];

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

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

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

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

4

5 回答 5

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

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

于 2010-03-26T23:29:38.613 回答
2

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

于 2010-09-23T00:54:30.327 回答
2

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

CGRect appFrame = [[UIScreen mainScreen] applicationFrame];

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

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

这个对我有用。

于 2011-10-31T22:54:14.400 回答
0

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

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

将其插入到作为导航控制器的父视图的视图控制器中:

- (void) viewDidAppear:(BOOL)animated {
    if (navigationController.navigationBar.frame.origin.y != 0) {
        [[navigationController view] removeFromSuperview];
        [[self view] addSubview:navigationController.view];
    }
}
于 2012-04-17T08:59:35.307 回答
0

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

self.edgesForExtendedLayout = [.top, .bottom]
于 2020-07-24T21:38:39.480 回答