为什么我的根视图的高度不考虑其导航栏?

时间:2011-05-16 14:23:05

标签: iphone cocoa-touch uiview uinavigationcontroller

我的印象是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];

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

2 个答案:

答案 0 :(得分:18)

所以,按要求:

当你致电viewDidLoad时,视频控制器还没有被推到屏幕上。因此,当您从该方法中获得帧大小时,它将报告其默认值(通常,iPhone应用程序为320x480)。

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

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

答案 1 :(得分:3)

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

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

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

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