将导航控制器添加到基于视图的应用程序会增加上边距

时间:2011-03-26 21:23:38

标签: objective-c cocoa-touch ios4

我正在尝试以编程方式将导航控制器添加到基于View的应用程序。这是我正在使用的代码(在视图控制器中按下按钮后调用此代码):

MainMenu *control = [[MainMenu alloc] initWithNibName: @"MainMenu" bundle: nil];
UINavigationController *navControl = [[UINavigationController alloc] initWithRootViewController: control];
[self.view addSubview:navControl.view];
[control release];

这样可行,但最终会发生这种情况:

enter image description here

注意导航控件上方的奇数边距....我添加导航控制器的我的视图控制器有一个灰色背景,你可以看到。

任何想法??

如果您有更好的方法将导航控制器添加到基于视图的应用程序,我非常乐于接受建议!

提前谢谢!

5 个答案:

答案 0 :(得分:2)

感谢您的回复,但不幸的是,wantsFullScreenLayout设置为代码中的YESNO没有任何效果。我能够使用以下代码行将导航控制器向上推20:

self.navigationController.navigationBar.frame = CGRectOffset(self.navigationController.navigationBar.frame, 0.0, -20.0);

但接下来发生的事情是视图控制器没有向上移动导航栏并在导航栏和视图控制器下方留下间隙。最终工作的是检查Wants Full Screen视图控制器中IB的MainWindow复选框,该复选框是在设置基于视图的应用程序时自动生成的。

答案 1 :(得分:1)

您看到的差距与状态栏的高度相同。检查NIB文件中的状态栏设置。

答案 2 :(得分:1)

您可能希望将UINavigationController设置为窗口的根视图控制器,而不是您现在拥有的任何视图控制器。这将是更好的方法。

您在顶部看到额外边距的原因是因为UINavigationController通常希望它的大小可以填充整个屏幕(除非底部有一个标签栏,如果它在UITabBarController中),因此需要如果状态栏可见,则其视图的上边缘将位于状态栏下方。因此,它将其导航栏放置在其视图顶部下方20个像素处,以便为状态栏留出空间,而无需检查其视图实际上是是否在状态栏下。有趣的是,有时重新布局操作会执行此检查,但这是不可靠的。我发现在这种情况下工作得很好的是将UINavigationController的wantsFullScreenLayout属性设置为NO。然后ti不会试图为状态栏留出空间,所以一切都按预期工作。

答案 3 :(得分:1)

今天早上我一直在努力解决这个问题。由于设置wantsFullScreenLayout属性似乎没有任何影响,我使用了一个小子类,它运行良好:

@interface MyNavigationController : UINavigationController
@end

@implementation MyNavigationController

- (BOOL)wantsFullScreenLayout;
{
    return NO;
}

@end

答案 4 :(得分:1)

消除这种差距非常简单..

self.navigationBar.view.frame = CGRectMake(0, -20, 320, 480);
相关问题