ViewController中的UINavigationController,视图顶部的间隙

E-M*_*add 19 iphone xcode interface-builder ipad ios

我正在开发一个通用应用程序,我正试图在iPhone和iPad版本之间共享尽可能多的代码.我需要使用一个TabBarController作为我的根视图控制器,虽然我想每个选项卡的使用SplitViewController,SplitViewController的文档说,它需要的根视图控制器.因此,考虑到所有这些 - 了解我正在尝试并排放置两个导航控制器,并且(大部分)复制SplitViewController的行为/布局.

一切都很好,除了视图的布局.当应用程序以纵向模式启动时,一切都会在设备方向改变时正常运行并调整大小/位置.

纵向

如果应用程序以UIDeviceOrientationPortrait以外的任何方向启动,则视图将在导航控制器上方显示20点间隙/边距.我试过在运行时调整帧没有完美的结果.将框架的origin.y调整为-20并将高度增加20会使视图与其父级的顶部齐平,但在底部留下20个点的间隙!

景观取向

kev*_*vin 25

我在我的应用程序中通过隐藏然后在添加导航控制器视图后显示导航栏解决了这个问题.例如.

[parentView addSubview:navController.view];
[navController setNavigationBarHidden:YES];
[navController setNavigationBarHidden:NO];
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,我强烈建议这个解决方案超过其他-20像素黑客. (4认同)

Bre*_*don 16

奇怪的是,在iOS 6中对我有帮助的是继承UINavigationController并实现此方法:

- (BOOL)wantsFullScreenLayout {
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

在我的故事板中取消选中"想要全屏"并没有成功,所以我不知道有什么不同.这肯定会在iOS的未来版本中破裂.但就目前而言,我会接受它.


Ano*_*mie 3

UINavigationController 通常显示为全屏控制器,这意味着(当显示为窗口的根视图控制器时)其视图的顶部位于状态栏下方。然后,当状态栏可见时,它会手动定位其导航栏和内容视图,以免与状态栏重叠。不幸的是,当它被其他视图控制器定位时,它并不能真正正确地处理事情,它(有时)假设它需要留下 20px 的间隙,而不检查它的视图是否实际上位于状态栏下方。

解决方案是将wantsFullScreenLayoutUINavigationController 设置为 NO,这样它就不会尝试为状态栏留下该间隙。