查看隐藏在UINavigationBar iOS 7下面

之前,我为我的项目使用了iOS 6.1。 最近我已经切换到iOS 7.对于我所知道的很多更改,我更新了代码。但是我观察到一个奇怪的行为。 我在每个屏幕上的视图都隐藏在导航栏下方。 重新定位视图解决了iOS7的问题,但为较老的iOS版本创build问题。

任何人都可以解释我,是什么原因,为什么会发生? iOS 7中导致这个问题的原因是什么?

任何帮助,将不胜感激..

尝试navigationBar.translucent = NO; 在iOS7中默认为YES

看一下UINavigationBar文档的这一部分也是很好的:

iOS 7上的新行为。默认为YES。 您可以通过将该属性设置为NO来强制背景不透明。 如果导航栏有一个自定义的背景图像,默认值是从图像的alpha值推断出来的,如果它具有alpha <1.0的任何像素如果你发送setTranslucent:YES到一个不透明的自定义背景图像的酒吧,它将适用系统不透明度小于1.0的图像。 如果将setTranslucent:NO发送到具有半透明自定义背景图像的条形图,则会使用条形图的barTintColor(如果已定义)为图像提供不透明的背景,如果barTintColor为零,则为UIBarStyleBlack提供黑色或为UIBarStyleDefault提供白色。

编辑

如果您在具有较旧iOS版本的设备/模拟器中运行项目,则设置“navigationBar.translucent”值会导致exception。

所以你可以添加一个像这样的版本检查:

 float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; if (systemVersion >= 7.0) { navigationBar.translucent = NO; } 

另一个select是设置:

 vc.edgesForExtendedLayout = UIRectEdgeNone; 

Swift 3

 vc.edgesForExtendedLayout = [] 

你可以在viewController中停止你的视图在导航栏下:

 self.edgesForExtendedLayout = UIRectEdgeNone; 

Swift 3+:

 self.edgesForExtendedLayout = [] 

如果你的应用中不需要半透明的导航栏,你可以在iOS7和iOS6上修正这个问题,而不需要修改代码。

在故事板中select您的导航控制器,然后打开“属性检查器”。 然后在“模拟度量标准”下将“顶部栏”设置为某个值,但不是“半透明”:

设置顶部酒吧风格

现在,您在iOS6和iOS7上的视图将具有与之前相同的定位。

这个名单上的点#7是诀窍。 你仍然必须把它包装在iOS 7检查代码中,比如@ null的答案:

 float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; if (systemVersion >= 7.0) { viewController.edgesForExtendedLayout = UIRectEdgeNone; } 

整篇文章对于那些过渡到iOS 7的人来说是有用的。

查找这个键: UIViewControllerBasedStatusBarAppearance

它被用在你的应用程序的信息PLIST文件中,并将作为:

查看基于控制器的状态栏外观

这将允许您控制状态栏的外观。 状态栏有一堆API改变,请查看文档中的新UIViewController方法,例如

- (void)prefersStatusBarHidden;

为了避免你的状态栏与你的VC Swift重叠,使用这个属性为你的VC:

 self.edgesForExtendedLayout = [] 

目标C

 self.edgesForExtendedLayout = UIRectEdgeNone; 

在Swift 2.2中,使用

 self.edgesForExtendedLayout = .None 

对我来说,透明Navigation Bar的最佳方法是更改Navigation Bar的shadowImage和backgroundImage。

 navigationController?.navigationBar.isTranslucent = true navigationController?.navigationBar.backgroundColor = nil navigationController?.navigationBar.setBackgroundImage(UIImage(named: "navBarBackground")?.resizableImage(withCapInsets: .zero, resizingMode: .stretch), for: .default) navigationController?.navigationBar.shadowImage = UIImage()