UINavigationController顶部有额外的状态栏间隙
设置时看起来很简单,但我无法解释为什么状态栏和导航栏之间存在这种差距。另外,包含的视图看起来好像可以正确对齐,并且它只是向下移动的导航栏。这个差距看起来像状态栏的大小,所以我期望这与它有关,但我不知道是什么。UINavigationController顶部有额外的状态栏间隙
这里是用于设置导航控制器的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
advancedVC = [[AdvancedSearchFormVC alloc] initWithNibName:@"AdvancedSearchForm" bundle:nil];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:advancedVC];
nav.navigationBar.tintColor = [UIColor defaultNavBarTint];
nav.navigationBar.topItem.title = NSLocalizedString(@"SearchTitle", nil);
UIBarButtonItem *searchButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"SearchButton", nil) style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)];
nav.navigationBar.topItem.rightBarButtonItem = searchButton;
self.view = nav.view;
}
的RootViewController的使用从XIB文件,其中我有模拟状态栏,导航条的视图,并且标签栏。
通过修复导航控制器的插入方式解决了问题。导航控制器应该直接放置在导航控制器上,而不是将其插入到已经放置在标签栏控制器上的视图中。
advancedSearchFormVC = [[AdvancedSearchFormVC alloc] initWithNibName:@"AdvancedSearchForm" bundle:nil];
UINavigationController *searchNavController = [[UINavigationController alloc] initWithRootViewController:advancedSearchFormVC];
这只是一个控制器,在tabbar控制器上,同时替换advancedSearchFormVC。然后,这个导航控制器被添加到控制器的数组,并将其放到tabbar控制器上。
对不起,有任何问题,但这是我可以直接看,而不是看到它的问题之一。我之前应该看到过这种情况,因为我已经在TabBar控制器上安装了另一个导航控制器,并且它的设置方式与此相同。
感谢您的协助。
Jim - 我没有完全按照你的解决方案。你可以发布代码来显示实际修复吗? – DoctorG 2012-06-29 09:36:01
既然你加入advancedVC
为的self.view
一个子视图,它被的self.view
我猜已经补偿了状态栏框内添加。
你或许可以很容易地加入这一行解决这个问题:
nav.view.frame = self.view.frame;
只是上面这条线:
self.view = nav.view;
-
其他的想法
我不知道你的整个设置,但可能根本不需要。只需使您的App Delegate中包含的UIWindow
实例的advancedVC
实例为rootViewController
即可。
我以前有同样的问题。我曾经UINavigationBar的增加的UIViewController代码:
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:self];
[self.view addSubview:nc.view];
解决方案:
勾选“想全屏”与您的UIViewController属性检查器。
问题的确是,导航控制器总是期望为状态栏留下空间,这是20像素的差距。我搜索了一段时间才找到这个解决方案,它的工作原理:
//nav is assumed to be a subclass or instance of UINavigationController
nav.view.frame = CGRectOffset(nav.view.frame, 0.0, -20.0);
//you can then add the navigation's view as a subview to something else
我最初发现一个答案,这样做偏移到导航栏的看法,但没有奏效。它在您对导航控制器实际视图执行操作时起作用。
我使用这种技术将导航控制器从另一个笔尖添加到我的主笔尖的空视图,因此我可以将它定位在主屏幕中的任何位置作为子视图。通过在我的主要笔尖上使用空视图作为占位符和定位框架,我创建了一个单独的笔尖和类来管理导航,该导航管理用于处理其屏幕的其他笔尖。这样,我可以解决经典的“我如何在导航控制器上添加横幅,图像或自定义视图”,同时将导航控制器作为子视图...在iOS 5中具体说明。
另外值得一提的是,我使用应用程序委托来存储和访问所有其他控制器,因此它们被持久实例保留,我可以从任何类访问它。在所有控制器的应用程序委托中创建并合成一些属性,然后在viewDidLoad创建实例中进行合成。这样,我可以通过添加引用我的应用程序后的任何地方使用的所有控制器:
//this shows how to store your navigation controllers in the app delegate
//assumes you've added 2 properties (UINavigationController*)"navController" and (UIViewController*)"rootController" in your app delegate
//...don't forget to add #import "AppDelegate.h" to the top of the file
AppDelegate *app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
[app.navController pushViewController: app.rootController animated:YES];
//now apply the offset trick to remove the status gap
app.navController.view.frame = CGRectOffset(app.navController.view.frame, 0.0, -20.0);
已找到相同的解决方案,但我不满意它... – iWheelBuy 2012-12-24 09:56:28
@Ali谢谢你的解决方案!非常好! – gaussblurinc 2013-08-05 13:14:47
大家都知道,现在,20个像素位移为顶部的状态栏提供了空间。 但实际上,视图控制器坐标系保持不变,只有导航栏框向下移动20个像素。这使得导航栏实际上重叠了视图的前20个像素。
记录导航栏帧起源,它会显示(0.0,20.0)
因此该解决方案是在viewWillAppear中简单地重新定位导航栏的原点至(0.0,0.0)。
self.navigationController.navigationBar.frame = CGRectMake(0.0, 0.0, self.navigationController.navigationBar.frame.size.width, self.navigationController.navigationBar.frame.size.height);
你可以尝试设置属性下最热门酒吧选中从属性的UIViewController部分。
这对我有用,谢谢。 – 2014-07-17 05:39:12
问题是应该将UINavigationController.view添加到顶视图。 只要找到最顶级的一个,它会工作得很好。
请注意,这是iOS 5和更早版本之间存在差异的区域。如果你使用导航控制器的“canned”布局,它是相当便携的,但是如果你已经定制了它,那么这两个版本之间的事情会有很大的变化。 (我从来没有完全明白造成这种差异的原因,但是您展示的是iOS 5上运行的iOS 4代码的典型代码。) – 2012-01-15 22:25:04
请参阅此问题的第一个答案http://stackoverflow.com/questions/5850705/why-do-navigation-appear-20-pixels-below-status-bar-in-the-view – CarmeloS 2013-04-03 06:52:57