【问题标题】:Why doesn't my root view's height take account of its navigation bar?为什么我的根视图的高度不考虑它的导航栏?
【发布时间】:2011-08-26 12:06:20
【问题描述】:

我的印象是 UINavigationController 的导航栏总是会向下推子视图的高度,这样子视图的原点就在标题栏的底部。

但是当我呈现这样的视图控制器时......

MyViewController *viewController = [[MyViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
viewController.title = @"My View Controller";
viewController.navigationItem.prompt = @"My Prompt";
viewController.delegate = self;

[self presentModalViewController:navigationController animated:YES];
[navigationController release]; [viewController release];

...然后在viewDidLoad 中使用NSLog 检查self.view.frame.size.height,它报告我的视图高460px。它不应该减去我的标题和提示的高度吗?

【问题讨论】:

  • 您是否也将self.view.frame.size.height 登录到viewWillAppear?在我的脑海中,典型的行为是 vc 只有在被推入视野时才会调整自身大小。
  • @lxt 你说得对!请在答案中重写,以便我将其标记为正确:)
  • 很高兴我能帮上忙。下面重写了。

标签: iphone cocoa-touch uiview uinavigationcontroller


【解决方案1】:

所以,按照要求:

当您调用viewDidLoad 时,视图控制器还没有被推送到屏幕上。因此,当您从该方法中获取帧大小时,它将报告其默认值(对于 iPhone 应用,通常为 320x480)。

然后视图会自动调整大小以考虑导航栏。因此,当您检查 viewWillAppear 中的帧大小时,它现在是正确的。通常这对 iPhone 应用程序来说不是问题。对于 iPad 应用程序,您有多个方向,这可能会有点痛苦!

这有一些例外 - 例如,使用 NIB 时。

【讨论】:

    【解决方案2】:

    您可能在这里指的是错误 self。 当self 指代MyViewController 实例时,您的高度可能为460 - 44 像素(标准UIToolbar 高度),但如果self 指代父视图控制器(例如导航视图控制器本身),您'将看到标准视图高度(例如 460 像素)。

    您可以通过在 MyViewController 的实例中调用 self.view.frame.size.height 来检查这一点,例如当视图完成加载(viewWillAppear: 方法),因此它的导航控制器已经调整了大小。

    如果您从viewDidLoad 方法调用self.view.frame.size.height,则视图可能仍未被其父控制器调整大小。

    请再试一次,如果这能解决您的问题,请告诉我。

    【讨论】:

    • 我有点困惑——无论是在viewDidLoad 还是viewWillAppear,“自我”不都是一样的吗?它确实有所作为(正如我在viewWillAppear 中所期望的那样工作),但我怀疑这是因为viewDidLoad 中的视图尚未调整大小,正如lxt 上面所建议的那样。
    • 是的,你是对的,self 在这两种方法中是一样的,我以为你是从其他地方调用它。 viewWillAppear: 在视图被绘制后被调用,因此已经调整到正确的尺寸。刚刚更新了答案。
    猜你喜欢
    • 2021-08-17
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多