UINavigationController的视图和20点偏移量

时间:2012-02-13 11:51:11

标签: ios uinavigationcontroller uinavigationbar offset

这是一个已发布的问题,但我需要了解以下情况发生了什么。我正在开发一个iPad应用程序,我创建了一个UINavigationController,如下所示(测试目的)。

UINavigationController* navigationController = [[UINavigationController alloc] init];        
navigationController.view.backgroundColor = [UIColor redColor];

创建后,我将UINavigationController的视图添加为UIViewController的子视图。

[self.view addSubview:navigationController.view];

结果显示在下图中:

enter image description here

如您所见,状态栏与UINavigationController的导航栏之间存在差距。由于UINavigationController的视图为红色,因此导航栏的框架似乎有差距。

我找到了解决这个问题的黑客攻击。通过设置UINavigationController的框架,导航栏将处于正确的位置。

CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect frameRect = CGRectMake(navigationController.view.frame.origin.x, navigationController.view.frame.origin.y - statusBarFrame.size.height, navigationController.view.frame.size.width, navigationController.view.frame.size.height);

navigationController.view.frame = frameRect;

现在,既然我不太喜欢黑客攻击而且我会理解发生了什么,你有什么建议可以找到解决问题的优雅解决方案吗?

提前谢谢。

4 个答案:

答案 0 :(得分:4)

20px偏移用于状态栏,导航控制器设计为全屏,但您将其添加到主视图的子视图中。

答案 1 :(得分:1)

viewController setWantsFullScreenLayout:YES

它可能对你有帮助。

答案 2 :(得分:1)

这是解决所有问题的修复方法。所以想到发布它可能真的。

如何运作

这会将我的导航栏原点设置为0,反过来导航视图也会设置为0,它会引用导航栏,这可以解决所有混乱:)

44是代码中导航栏的高度。 :)

将代码放入ViewDidAppear

   CGRect windowFrame = [UIScreen mainScreen].applicationFrame;
   //Setting the Origin to 0 of both Navigation Bar and Navigation View for Both Landscape and Portrait
   if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)){
       [self.navigationController.navigationBar setFrame:CGRectMake(0, 0, windowFrame.size.width, 44)];
        [self.navigationController.view setFrame:CGRectMake(0, 0, windowFrame.size.width, windowFrame.size.height)];
    }
    else{
        [self.navigationController.navigationBar setFrame:CGRectMake(0, 0, windowFrame.size.height, 44)];
        [self.navigationController.view setFrame:CGRectMake(0, 0, windowFrame.size.height, windowFrame.size.width)];
    }

答案 3 :(得分:0)

[self setWantsFullScreenLayout:<#(BOOL)#>];

已弃用。如果要将子视图添加到ViewController而不必担心使用NevigationBar:

self.edgesForExtendedLayout = UIRectEdgeNone;