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

Objective c 将导航控制器添加到基于视图的应用程序会增加上边距,objective-c,cocoa-touch,ios4,Objective C,Cocoa Touch,Ios4,我试图以编程方式将导航控制器添加到基于视图的应用程序中。这是我正在使用的代码(在视图控制器中按下按钮后调用此代码): 这是可行的,但最终会发生: 请注意导航控件上方的奇数边距。。。。我正在添加导航控制器的视图控制器具有灰色背景,您可以看到 有什么想法吗 如果您有更好的方法将导航控制器添加到基于视图的应用程序中,我非常乐意听取您的建议 提前谢谢你 您看到的间隙与状态栏的高度相同。检查NIB文件中的状态栏设置。您看到的间隙与状态栏的高度相同。检查NIB文件中的状态栏设置。您可能希望使UINavig

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

这是可行的,但最终会发生:

请注意导航控件上方的奇数边距。。。。我正在添加导航控制器的视图控制器具有灰色背景,您可以看到

有什么想法吗

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


提前谢谢你

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

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

您可能希望使UINavigationController成为窗口的根视图控制器,而不是现在使用的任何视图控制器。这样做会更好


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

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


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

感谢你们的回复,但不幸的是,
wantFullScreenLayout
在代码中设置为
YES
NO
没有任何效果。我能够使用以下代码将导航控制器向上推20次:

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

但随后发生的情况是,视图控制器没有随着导航栏向上移动,而是在导航栏和视图控制器下方留下了一个间隙。最终起作用的是在设置基于视图的应用程序时自动生成的
主窗口
视图控制器的IB中选中
想要全屏
复选框

谢谢你们两位的回复,但不幸的是,
wantFullScreenLayout
在代码中设置为
YES
NO
没有任何效果。我能够使用以下代码将导航控制器向上推20次:

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

但随后发生的情况是,视图控制器没有随着导航栏向上移动,而是在导航栏和视图控制器下方留下了一个间隙。最终起作用的是在设置基于视图的应用程序时自动生成的
主窗口
视图控制器的IB中选中
想要全屏
复选框

今天早上我一直在为同一个问题苦苦挣扎。由于设置
wantsFullScreenLayout
属性似乎没有任何效果,我求助于使用一个小的子类,它工作得很好:

@interface MyNavigationController : UINavigationController
@end

@implementation MyNavigationController

- (BOOL)wantsFullScreenLayout;
{
    return NO;
}

@end

今天早上我一直在为同样的问题挣扎。由于设置
wantsFullScreenLayout
属性似乎没有任何效果,我求助于使用一个小的子类,它工作得很好:

@interface MyNavigationController : UINavigationController
@end

@implementation MyNavigationController

- (BOOL)wantsFullScreenLayout;
{
    return NO;
}

@end

消除这种差距是如此简单

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

消除这种差距是如此简单

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

你是一个传奇。你不知道我寻找解决这个问题的方法有多久了!14个小时后,状态栏上那个愚蠢的地方消失了!对你是一个传奇。你不知道我寻找解决这个问题的方法有多久了!14个小时后,状态栏上那个愚蠢的地方消失了!对似乎没有效果,至少在iPad/iOS 5上是这样。当您尝试设置
wantsFullScreenLayout=NO
时,导航控制器总是返回
wantsFullScreenLayout=YES
我也发现了这一点(设置wantsFullScreenLayout没有效果)。因为我已经有了自己的UINavigationController子类,所以我实际上重写了getter以返回NO,并且一切按预期工作似乎都没有效果,至少在iPad/ios5上是这样。当您尝试设置
wantsFullScreenLayout=NO
时,导航控制器总是返回
wantsFullScreenLayout=YES
我也发现了这一点(设置wantsFullScreenLayout没有效果)。因为我已经有了自己的UINavigationController子类,所以我实际上重写了getter以返回NO,并且一切都按照预期工作