【问题标题】:Adding a UINavigationController as a subview of UIView添加 UINavigationController 作为 UIView 的子视图
【发布时间】:2010-03-26 21:51:19
【问题描述】:

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

这是我使用的层次结构:

  • 用户界面窗口
    • UILabel
    • UINavigationController

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

  • 用户界面窗口
    • UIViewController
      • UI 视图
        • UILabel
        • UINavigationController

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

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

[myViewController.view addSubview:myNavigationController.view];

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

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

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

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

【问题讨论】:

    标签: cocoa-touch uiview uiviewcontroller uinavigationcontroller subview


    【解决方案1】:

    使用此代码似乎有效:

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

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

    【讨论】:

    • 使用 nav.view.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);为了让这也适用于 ipad,它没有 +20 错误,但在宽度和高度方面存在其他问题,总的来说,这是一个完全的瓦罐,非常草率的苹果
    • 我有一个实例,如果我在 iPad 上以横向模式将 UINavigationController 视图加载为子视图,我确实会遇到 20 像素错误。但也只是第一次。我可以稍后将其重新添加到超级视图中,问题就会消失。非常非常令人沮丧。
    • 看来我也有同样的问题。没有什么能真正告诉我导航栏的垂直偏移量为 20 像素。 @DanielWood 我真的和你一样沮丧。如果我按下然后弹出另一个控制器,一切正常,但第一次......我试试你的游戏。
    • 我认为句子“I did this before adding the navigation controller as a subview.”应该写成粗体、红色、带下划线的字体——对我来说,它是解决20像素问题的最关键部分。当我在将导航视图添加为子视图之前设置它的框架时 - 问题就消失了:)
    • 这应该可以解决在父子视图上多次重新加载 navigaitonView 的问题。 gist.github.com/2961401
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
      

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

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

      这个对我有用。

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          【解决方案5】:

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

          self.edgesForExtendedLayout = [.top, .bottom]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-04-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-26
            相关资源
            最近更新 更多