UINavigationController栏包含其uiviewcontroller的内容

时间:2013-12-27 23:20:00

标签: ios uiviewcontroller uinavigationcontroller uitoolbar nslayoutconstraint

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

View 
  - subview1
  - subview2
  - UIToolbar
     - Bar Button Item1
     - Bar Button Item2
     - Bar Button Item3

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

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

根据apple documentation

  

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

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

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

4 个答案:

答案 0 :(得分:19)

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

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

self.navigationController.navigationBar.translucent = NO

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

答案 1 :(得分:8)

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

self.edgesForExtendedLayout = UIRectEdgeNone; 

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

答案 2 :(得分:0)

确定您使用的是iOS 7.

#define IS_IOS7 [[[UIDevice currentDevice] systemVersion] hasPrefix:@"7"];

- (float)topPadding
{
    return (IS_IOS7) ? 20.0f : 0.0f;
}

使用[self topPadding]增加框架的Y轴将其向下移动。

我希望你的问题得到解决。

答案 3 :(得分:0)

如果用Swift编写,那就是edgesForExtendedLayout = UIRectEdge()