UINavigationController栏包含其uiviewcontroller的内容

ror*_*oro 14 uitoolbar uiviewcontroller uinavigationcontroller ios nslayoutconstraint

我有一个UIViewController,MyViewController,顶部有一个UIToolbar.使用界面构建器,doc outline如下所示:

View 
  - subview1
  - subview2
  - UIToolbar
     - Bar Button Item1
     - Bar Button Item2
     - Bar Button Item3
Run Code Online (Sandbox Code Playgroud)

MyViewController在我的应用程序中使用.有时它在UINavigationcontroller中,有时它在UIPopoverView中.

当它出现在UINavigationController中时,导航栏会覆盖UIToolbar以及View顶部附近的所有其他内容.在此屏幕截图中,您可以看到UIToolbar完全被遮盖,并且UIButton带有绿色灯泡的图像被部分覆盖.

根据苹果文档

任何需要锚定到顶部和状态栏下方的视图(即UIToolbar,UIButton等)都需要额外的工作才能正确放置.

它继续提供一个解决方案,简单地使用约束将VC的内容向下移动x像素,在我的例子中是UIToolbar.这似乎不是一个好的解决方案,因为它假设您总是希望将内容向下移动到导航栏下方.在我的情况下,我显然不这样做,因为MyViewController并不总是在UINavigationController中.当我使用这些文档中提供的约束解决方案时,在MyViewController不在UINavigationController中的所有情况下,UIToolbar奇怪地从顶部浮动x像素.

我是否错过了我应该如何在UINavigationController中显示VC的内容?非常感谢.

Kyo*_*ang 19

在iOS7中,UINavigationBar具有半透明属性.这样,UINavigationViewController的子VC视图默认位于UINavigationBar下.

如果您不需要获得半透明效果,请使用以下代码关闭此属性.

self.navigationController.navigationBar.translucent = NO
Run Code Online (Sandbox Code Playgroud)

您也可以使用@ ldindu的方式来满足您的需求.


ldi*_*ndu 8

如果您在iOS 7.0版本上运行,则需要设置iOS 7.0中新引入的以下属性,如下所示

self.edgesForExtendedLayout = UIRectEdgeNone; 
Run Code Online (Sandbox Code Playgroud)

默认情况下,edgesForExtendedLayout属性设置为UIRectEdgeAll,这意味着视图控制器默认使用全屏布局.