与iPhone UINavigationController(UINavigationBar在错误的地方)的麻烦

时间:2011-05-18 02:54:37

标签: iphone uinavigationcontroller

我正在对应用进行一些调整,包括更改为基于导航的界面。作为该更改的一部分,我编写了一个包含UINavigationController的视图控制器。问题是,由于某些奇怪的原因,UINavigationBar管理的UIToolbarUINavigationController从应有的位置下移了20px。我已设法生成以下示例来演示此问题:

// MyAppDelegate.m

@implementation MyAppDelegate
@synthesize window = _window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window.frame = [[UIScreen mainScreen] applicationFrame];
    [self.window makeKeyAndVisible];

    TestController* tc = [TestController new];
    [self.window addSubview:tc.view];

    return YES;
}

@end

// TestController.m

@implementation TestController

- (void)loadView
{
    self.view = [[UIView alloc] initWithFrame:CGRectZero];

    UINavigationController* navController = [UINavigationController new];
    navController.view.backgroundColor = [UIColor blueColor];
    [navController setToolbarHidden:NO animated:NO];

    [self.view addSubview:navController.view];
}

@end

这会在我的机器上产生以下结果:

Shot of example

正如您所看到的,控件比我预期的要低20px。我已经尝试了我能想到的所有事情(wantsFullScreenLayoutautoresizesSubviews等的各种组合)而没有任何积极影响。这也与以编程方式搞乱状态栏无关(在我遇到的大多数其他示例中似乎就是这种情况),因为我在任何时候都不会搞乱状态栏。在导航控制器中有或没有根视图控制器时会发生这种情况 - 如果有的话,它的内容也会向下移动20px(因此它们实际上相对于导航栏和工具栏位于正确的位置)。

非常感谢任何帮助!

编辑:经过一番调查后,似乎删除了行self.window.frame = [[UIScreen mainScreen] applicationFrame];似乎纠正了导航栏和工具栏及内容的位置。也就是说,现在应用程序中的其他一些视图位于错误的位置(位于状态栏下方)。我的理解是通常建议使用线来确保窗口尺寸正确吗?

2 个答案:

答案 0 :(得分:1)

正如我在编辑中所提到的,删除行self.window.frame = [[UIScreen mainScreen] applicationFrame];似乎已经纠正了95%的问题。我设法通过使用相同的背景颜色来修复其他5%的方法,其余的视图有问题,但我不能说我对此解决方案很激动 - 我不应该那样做。

我会继续尝试,如果我找到更好的结果肯定会在这里发布一个编辑。

答案 1 :(得分:0)

UINavigationController不能很好地用作子视图;正如您所注意到的,即使状态栏实际上不在状态栏下,它也会为状态栏留出空间。如果您没有尝试编写自己的容器视图控制器,则应该重新编写代码,而不是将视图控制器的视图添加为子视图。

那就是说,通过在UINavigationController上将wantsFullScreenLayout设置为NO,我已经很幸运了,这将使它不会为状态栏留出空间。当然,您希望在分配之后,在loadView被触发之前完成此操作。