早些时候,我在我的项目中使用 iOS 6.1。最近我切换到 iOS 7。因为,我知道很多变化,我更新了我的代码。但我观察到一个奇怪的行为。我在每个屏幕上的视图都隐藏在导航栏下方。重新定位视图解决了 iOS7 的问题,但对旧的 iOS 版本产生了问题。
谁能解释一下,这是什么原因,为什么会发生?导致此问题的 iOS 7 中发生了什么变化?
任何帮助,将不胜感激..
早些时候,我在我的项目中使用 iOS 6.1。最近我切换到 iOS 7。因为,我知道很多变化,我更新了我的代码。但我观察到一个奇怪的行为。我在每个屏幕上的视图都隐藏在导航栏下方。重新定位视图解决了 iOS7 的问题,但对旧的 iOS 版本产生了问题。
谁能解释一下,这是什么原因,为什么会发生?导致此问题的 iOS 7 中发生了什么变化?
任何帮助,将不胜感激..
试试看navigationBar.translucent = NO;
,YES
iOS7默认是这样的。
看看这部分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 = []
您可以在 viewController 中的导航栏下停止视图:
self.edgesForExtendedLayout = UIRectEdgeNone;
斯威夫特 3+:
self.edgesForExtendedLayout = []
如果您的应用不需要半透明导航栏,您可以在 iOS7 和 iOS6 上修复此问题,无需更改代码。
在情节提要中选择您的导航控制器,然后打开“属性检查器”。然后在“模拟指标”下将“顶栏”设置为某个值,但不设置为“半透明”:
现在你在 iOS6 和 iOS7 上的视图将和以前一样定位。
此列表中的第 7 点可以解决问题。您仍然必须将其包装在 iOS 7 检查代码中,例如@null 的答案:
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0) {
viewController.edgesForExtendedLayout = UIRectEdgeNone;
}
整篇文章对过渡到 iOS 7 的人很有用。
将此属性用于您的 VC,以避免您的状态栏与您的 VC Swift 重叠:
self.edgesForExtendedLayout = []
目标 C
self.edgesForExtendedLayout = UIRectEdgeNone;
查找此键:UIViewControllerBasedStatusBarAppearance
。
它在您的应用程序的信息 PLIST 文件中使用,并将显示为:
查看基于控制器的状态栏外观
这将允许您控制状态栏的外观。状态栏有很多 API 更改,请查看文档中的新UIViewController
方法,例如
- (void)prefersStatusBarHidden;
在 Swift 2.2 中,使用
self.edgesForExtendedLayout = .None
对我来说,透明的最佳方法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()