63

早些时候,我在我的项目中使用 iOS 6.1。最近我切换到 iOS 7。因为,我知道很多变化,我更新了我的代码。但我观察到一个奇怪的行为。我在每个屏幕上的视图都隐藏在导航栏下方。重新定位视图解决了 iOS7 的问题,但对旧的 iOS 版本产生了问题。

谁能解释一下,这是什么原因,为什么会发生?导致此问题的 iOS 7 中发生了什么变化?

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

4

9 回答 9

131

试试看navigationBar.translucent = NO;YESiOS7默认是这样的。

看看这部分UINavigationBar文档也很好:

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

编辑

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

因此,您可以像这样添加版本检查:

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

另一种选择是设置:

vc.edgesForExtendedLayout = UIRectEdgeNone;

斯威夫特 3

vc.edgesForExtendedLayout = []
于 2013-09-16T09:59:15.060 回答
47

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

self.edgesForExtendedLayout = UIRectEdgeNone;
于 2013-09-16T10:00:56.743 回答
21

斯威夫特 3+:

self.edgesForExtendedLayout = []
于 2016-10-29T03:49:44.137 回答
11

如果您的应用不需要半透明导航栏,您可以在 iOS7 和 iOS6 上修复此问题,无需更改代码。

在情节提要中选择您的导航控制器,然后打开“属性检查器”。然后在“模拟指标”下将“顶栏”设置为某个值,但不设置为“半透明”:

设置顶栏样式

现在你在 iOS6 和 iOS7 上的视图将和以前一样定位。

于 2013-09-25T07:59:23.407 回答
9

此列表中的第 7 点可以解决问题。您仍然必须将其包装在 iOS 7 检查代码中,例如@null 的答案:

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

整篇文章对过渡到 iOS 7 的人很有用。

于 2013-09-24T17:58:12.113 回答
7

将此属性用于您的 VC,以避免您的状态栏与您的 VC Swift 重叠:

self.edgesForExtendedLayout = []

目标 C

self.edgesForExtendedLayout = UIRectEdgeNone;
于 2017-03-30T21:09:34.070 回答
3

查找此键:UIViewControllerBasedStatusBarAppearance

它在您的应用程序的信息 PLIST 文件中使用,并将显示为:

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

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

- (void)prefersStatusBarHidden;

于 2013-09-16T09:53:55.970 回答
2

在 Swift 2.2 中,使用

self.edgesForExtendedLayout = .None
于 2016-09-08T19:17:40.580 回答
2

对我来说,透明的最佳方法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()
于 2017-04-06T12:44:36.663 回答