UINavigationController在顶部有额外的状态栏间隙

时间:2012-01-15 21:55:54

标签: ios cocoa-touch uinavigationcontroller uinavigationbar

当我进行设置时,这看起来很简单,但我无法解释为什么状态栏和导航栏之间存在这种差距。此外,包含的视图看起来可能正确对齐,它只是向下移动的导航栏。差距看起来像状态栏的大小,所以我希望它与它有关,但我不知道是什么。

Nav Bar with extra space

以下是设置导航控制器的代码:

- (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文件中的视图,我在其中模拟了状态栏,导航栏和标签栏。

7 个答案:

答案 0 :(得分:11)

问题确实是导航控制器总是希望为状态栏留出空间,即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中具体说明。

还值得一提的是,我使用app委托存储和访问所有其他控制器,因此它们由一个持久性实例保留,我可以从任何类访问它。在所有控制器的app委托中以及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);

答案 1 :(得分:7)

之前我遇到过同样的问题。我用来将UINavigationBar添加到UIViewController的代码:

UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:self];
[self.view  addSubview:nc.view];

<强>解决方案:
使用UIViewController的Attributes检查器选中“Wants Full Screen”框。

答案 2 :(得分:7)

您可以尝试从UIViewController的 Attributes 部分设置属性在顶栏下 取消选中

答案 3 :(得分:1)

众所周知,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);

答案 4 :(得分:0)

由于您要将advancedVC添加为self.view子视图,因此会将其添加到self.view的框架中,我猜这已经是补偿状态栏。

您可以通过添加以下内容轻松解决此问题:

nav.view.frame = self.view.frame;

就在这一行之上:

self.view = nav.view;

-

其他想法

我不了解您的整个设置,但可能根本不需要self.view。只需将advancedVC实例设为应用代表中包含的rootViewController实例的UIWindow即可。

答案 5 :(得分:0)

通过修复插入导航控制器的方式解决了问题。 navigaiton控制器应该直接放在导航控制器上,而不是将其插入放在标签栏控制器上的视图中。

advancedSearchFormVC = [[AdvancedSearchFormVC alloc] initWithNibName:@"AdvancedSearchForm" bundle:nil];
UINavigationController *searchNavController = [[UINavigationController alloc] initWithRootViewController:advancedSearchFormVC];

这只是tabbar控制器上的一个控制器,同时替换了advancedSearchFormVC。然后将此导航控制器添加到已放入标签栏控制器的控制器阵列中。

对不起任何麻烦,但这是我可以直接看到的问题之一,而不是看到它。我之前应该已经看过了,因为我已经在tabbar控制器上安装了另一个导航控制器,并且设置方式相同。

感谢您的协助。

答案 6 :(得分:0)

问题是应该将UINavigationController.view添加到顶视图中。 找到最上面的一个,它会很有效。