IPhone-UIView添加顶部的子视图间隙

IPhone-UIView添加顶部的子视图间隙,iphone,uikit,uiview,Iphone,Uikit,Uiview,我有一个在MainWindow.xib中加载的视图。它只是一个包含uiimageview的视图,在整个屏幕上显示图像(320 X 480)。当应用程序加载时,我显示此视图,然后执行 [self.view addSubview:tabbarController.view]; 选项卡栏控制器只是一个添加了2个视图控制器的UITABBARC控制器。当它将tabbarController的视图添加到子视图时,会在顶部留下大约20px的间隙。我的应用程序有一个状态栏,但这基本上是另一个空间。除非将其添加

我有一个在MainWindow.xib中加载的视图。它只是一个包含uiimageview的视图,在整个屏幕上显示图像(320 X 480)。当应用程序加载时,我显示此视图,然后执行

[self.view addSubview:tabbarController.view];
选项卡栏控制器只是一个添加了2个视图控制器的UITABBARC控制器。当它将tabbarController的视图添加到子视图时,会在顶部留下大约20px的间隙。我的应用程序有一个状态栏,但这基本上是另一个空间。除非将其添加到视图控制器中,否则会发生这种情况:

self.view.frame = CGRectMake(0, 0, 320, 480);
有人能解释一下吗。我在做什么

self.view = tabbarController.view;

但是有人告诉我不应该那样做。现在我正在添加一个子视图,但我不明白为什么我必须调整视图的CGRect以不显示20px。

UIAbbarController希望将其视图添加为UIWindow的子视图,而不是其他UIView的子视图。frame属性定义了视图在其superview中的偏移,因此UITabBarController实现默认情况下将其视图的帧偏移20像素,以便为状态栏留出空间。您正在以非标准方式使用UITabBarController,将其添加到状态栏已偏移20像素的视图中。UITabBarController将其视图相对于其superview额外偏移20个像素,从而产生您看到的间隙

解决此问题的一种干净方法是将UITabBarController的视图添加为窗口的子视图,而不是视图:

[[[UIApplication sharedApplication] keyWindow] addSubview:tabbarController.view];

(注意:只有在您已经调用makeKeyAndVisible时,keyWindow方法才会返回您的窗口。否则,您可能需要在UIViewController上设置窗口属性。)

谢谢您的清晰解释。也许我应该回去重组我的部分应用程序。我希望以正确的方式进行操作,但我认为最好将视图控制器逻辑与应用程序委托分离,这样我的根视图控制器就可以完成它所需要的一切。这就解释了为什么在我的根视图控制器中,如果我添加self.view=tabbarController.view而不是作为子视图添加,我就不会得到间隙。回答得很好。如果可以的话,我会投更多的票。听起来你的直觉很好。这只是Cocoa Touch的设计限制之一,我们现在必须解决这些限制。但请记住,您不一定需要从应用程序代理将tabbarController.view添加到窗口中。如果您认为它最有意义,可以将其添加到视图控制器中。您只需要通过keyWindow方法或通过在ApplicationIDFinishLaunching:中将其设置为控制器上的属性来访问window对象,但这是否意味着tabbarcontroller.view现在是window.view的子视图?但在我的例子中,这是不正确的,我有一个广告视图,然后是第二个内容视图。我将tabbarcontroller.view添加到contentview。以这种方式,viewcontroller将根据广告处理内容/adview。如果我将tabbarcontroller.view添加到窗口中,我想我将无法使用viewcontroller处理视图。您认为如何?UITabBarController类参考说明:“部署选项卡栏界面时,必须将此视图安装为窗口的根。与其他视图控制器不同,选项卡栏界面不应作为其他视图控制器的子视图安装。”我理解您为什么希望tabbarcontroller.view成为您案例中不同视图的子视图。不幸的是,您必须反对这样一个事实,即该类基于其视图是窗口的子视图的假设来调整其帧。考虑使用UITabbar在自定义UIVIEW控制器中实现UITABBAREXPRATE。有趣的是,如何将20px添加到UITABAbController的VIEW Controller选项卡(子)以偏移IOS7状态栏?我尝试了很多解决方案,但都没有成功。