这是一个已发布的问题,但我需要了解以下情况发生了什么。我正在开发一个iPad应用程序,我创建了一个UINavigationController
,如下所示(测试目的)。
UINavigationController* navigationController = [[UINavigationController alloc] init];
navigationController.view.backgroundColor = [UIColor redColor];
创建后,我将UINavigationController
的视图添加为UIViewController
的子视图。
[self.view addSubview:navigationController.view];
结果显示在下图中:
如您所见,状态栏与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;
现在,既然我不太喜欢黑客攻击而且我会理解发生了什么,你有什么建议可以找到解决问题的优雅解决方案吗?
提前谢谢。
答案 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;