iOS 7状态栏与NavigationBar发生碰撞

AJ1*_*112 47 objective-c uinavigationbar uinavigationcontroller ios ios7

我的应用程序中有一个视图控制器,在故事板中拖动了导航栏.它在iOS 6中运行良好,但在iOS 7中它看起来像这样:

ios 7状态栏nav var

状态栏和导航栏不应相互冲突.我已经看到很多关于堆栈溢出的问题,但它们对我没什么帮助.

有些问题说我应该使用这个"self.edgesForExtendedLayout = UIRectEdgeNone;" 但它不起作用.有人说我应该删除导航栏并将其嵌入导航控制器中,由于我的程序实现方式,我无法做到这一点.一些解决方案建议使用视图边界,但它对我来说也不起作用.

有什么能帮助我解决这个问题.提前致谢!

更新:我已将视图控制器嵌入到uinavigation控制器中.删除了之前手动添加的导航栏.现在它在故事板中看起来不错,但是当我运行它时,它显示以下内容:

iOS 7导航状态栏

它显示来自其后面的另一个视图控制器的文本,即其父视图控制器.意味着它现在透明.谁能指出我做错了什么?

小智 66

最新版本的iOS带来了许多视觉上的变化,从开发人员的角度来看,导航和状态栏是两个显着的变化.

状态栏现在是透明的,后面的导航栏显示出来.导航栏图像甚至可以扩展到状态栏后面.

首先,如果你是一个初学者,刚开始iOS开发和感到困惑的方式状态栏和导航栏的工作,你可以简单地经过一个博客帖子这里,我发现非常有用的.它包含iOS 7中与导航和状态栏相关的所有信息.

现在回答你的问题.首先,我可以看到两个不同的问题.一个是您的状态栏和导航栏都是相互碰撞的,如您在带图像的问题中所示.

问题:问题是您之前已经在视图控制器中拖动了导航栏,该导航栏在iOS 6中正常工作但随着iOS 7 SDK的到来,这种方法导致状态栏和导航栏相互重叠.

第一个问题的解决方案:您可以使用UIBarPositionTopAttached或者您可以使用视图边界和框架,我也可以建议并链接到Apple的文档和bla bla bla,但这需要一些时间来解决问题.

解决此问题的最佳和最简单的方法是将视图控制器嵌入到导航控制器中,就是这样.您只需选择视图控制器并转到编辑器>嵌入>导航控制器即可完成此操作.(如果旧导航栏上有任何内容,您可以先将其向下拖动,将视图控制器嵌入导航控制器中,然后移动新导航栏上的栏按钮,然后删除旧的导航栏)

第二个问题的解决方案:此解决方案适用于您在更新中提到的特定问题,而不是一般公众阅读此问题.如您所见,导航和状态栏不可见,透明区域显示父视图控制器.我并不真正使用你为什么面对这个问题,但很可能是因为某些第三方库,如ECSlidingView或其他任何涉及.您可以在故事板中选择此视图控制器,并将视图的背景颜色设置为与导航栏相同.这将停止显示后面的父视图控制器,您的导航栏和状态栏将开始显示.现在,您可以使用文本视图覆盖视图控制器的其余部分,或者在其中使用的内容.

希望这可以帮助!

  • >只是将你的视图控制器嵌入到导航控制器中,这条线花了我2天的时间来讨论吧,并在uitabbarcontroller内部提示.现在终于问题解决了,但是有一个问题:现在条形图的一部分不是透明的,透明部分只在状态栏下面.你能说明原因吗? (2认同)

Sco*_*ets 33

导航栏太靠近状态栏,因为从iOS 7开始,状态栏更多地覆盖整个视图控制器的视图.由于导航栏位于(0,0),状态栏将显示在导航栏的顶部.要解决此问题,只需向下移动导航栏(或者,如其他人所说),在导航栏和topLayoutGuide之间创建约束.

当你这样做时,你会发现导航栏和屏幕顶部之间有20点的间隙.那是因为你刚刚将导航栏向下移动了20个点."但UINavigationController能做得对!" 当然,它是通过UIBarPositioningDelegate在视图控制器上实现来实现的.这是一个单方法协议,应该像这样实现:

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar {
    return UIBarPositionTopAttached;
}
Run Code Online (Sandbox Code Playgroud)

将视图控制器添加为导航栏的代理后,您会注意到导航栏仍然向下移动了20个点,但其背景将在状态栏下方向上延伸,就像在中UINavigationController.

您看到的另一件事是导航栏是半透明的,这意味着导航栏下方的任何内容都会在某种程度上可见.默认情况下,iOS 7 translucent上的属性UINavigationBar设置为YES.在iOS 7之前,默认值为NO.