视图隐藏在 UINavigationBar iOS 7 下面

Posted

技术标签:

【中文标题】视图隐藏在 UINavigationBar iOS 7 下面【英文标题】:View got hidden below UINavigationBar iOS 7 【发布时间】:2013-09-20 10:11:17 【问题描述】:

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

谁能解释一下,这是什么原因,为什么会发生?导致此问题的 iOS 7 中的哪些更改?

任何帮助将不胜感激..

【问题讨论】:

查看一些关于将您的 iOS6 应用程序过渡到 iOS7 的 iOS7 WWDC 演讲。正如下面的答案所述,您可以更改您的 plist。发生这种情况的原因是因为 iOS7 的目标是边缘到边缘的内容,具有“层”和“深度”的感觉,所以现在状态栏和导航栏位于您的内容之上,而不是之上。 【参考方案1】:

试试navigationBar.translucent = NO;,iOS7默认是YES

看看UINavigationBar文档的这一部分也不错:

iOS 7 上的新行为。默认为 YES。你可以强制一个不透明的 通过将属性设置为 NO 来设置背景。如果导航栏有 自定义背景图片,默认从 alpha 值推断 图像的 - 是,如果它有任何 alpha

编辑

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

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

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0)

    navigationBar.translucent = NO;

另一种选择是设置:

vc.edgesForExtendedLayout = UIRectEdgeNone;

Swift 3

vc.edgesForExtendedLayout = []

【讨论】:

感谢您的解决方案.. 它确实解决了问题.. 现在我也明白为什么会这样了:-) if ([self.navigationBar respondsToSelector:@selector(setTranslucent:)]) 不起作用.. 导致崩溃。我首先尝试过.. 这对于那些想要以编程方式初始化视图控制器的人来说是一个救命稻草 我认为edgesForExtendedLayout 解决方案可能更好,至少在我的情况下,因为它保持导航栏半透明但视图定位正确。 self.edgesForExtendedLayout = UIRectEdgeNone;为我工作.. 非常感谢.. +1【参考方案2】:

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

self.edgesForExtendedLayout = UIRectEdgeNone;

【讨论】:

在许多头痛之后就是这样,这是去这里的最佳方式。谢谢 这也将阻止以编程方式添加到导航栏/状态栏下方(而不是下方)的滚动视图自动更改其内容偏移量就像它在栏下方一样【参考方案3】:

Swift 3+:

self.edgesForExtendedLayout = []

【讨论】:

还有其他解决方案吗?状态栏下方的视图有问题。【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

【参考方案6】:

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

self.edgesForExtendedLayout = []

目标 C

self.edgesForExtendedLayout = UIRectEdgeNone;

【讨论】:

【参考方案7】:

查找此密钥:UIViewControllerBasedStatusBarAppearance

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

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

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

- (void)prefersStatusBarHidden;

【讨论】:

您已经给出了状态栏外观的答案。但我要求查看隐藏在 UINavigationBar 下的视图。顺便说一句,+1 为您提供帮助.. :-) 哎呀,回答问题太高兴了:p【参考方案8】:

对我来说透明Navigation Bar最好的方法是改变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()

【讨论】:

【参考方案9】:

在 Swift 2.2 中,使用

self.edgesForExtendedLayout = .None

【讨论】:

以上是关于视图隐藏在 UINavigationBar iOS 7 下面的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 8 中将 ViewController 的 View 作为子视图添加到 UIPageViewController 会在显示/隐藏时产生奇怪的 UINavigationBar

iOS 7 UINavigationBar 隐藏了后退按钮

如何在 UINavigationBar 下方绘制主视图,以便当栏显示/隐藏时,视图不受影响?

UINavigationBar 子视图隐藏了正确的 UIBarButtonItem

防止 UISearchController 在 IOS8 中隐藏视图导航栏

UINavigationBar 的高度错误,因为加载时状态栏被隐藏