视图隐藏在UINavigationBar iOS 7下方

时间:2013-09-16 09:48:10

标签: iphone ios uiview ios7 navigationbar

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

任何人都可以解释一下,原因是什么?为什么会这样? iOS 7中发生了哪些变化导致了这个问题?

任何帮助将不胜感激..

9 个答案:

答案 0 :(得分:123)

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

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

  

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

修改

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

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

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

另一种选择是设置:

vc.edgesForExtendedLayout = UIRectEdgeNone;

Swift 3

vc.edgesForExtendedLayout = []

答案 1 :(得分:44)

您可以在viewController中的导航栏下停止您的观点:

self.edgesForExtendedLayout = UIRectEdgeNone;

答案 2 :(得分:21)

Swift 3 +:

channel

答案 3 :(得分:11)

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

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

Setting Top Bar style

现在,你对iOS6和iOS7的看法与之前的定位相同。

答案 4 :(得分:9)

this list上的第7点就可以了。您仍然需要将它包装在iOS 7检查代码中,如@ null的答案:

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

整篇文章对于转换到iOS 7的用户非常有用。

答案 5 :(得分:5)

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

self.edgesForExtendedLayout = []

目标C

self.edgesForExtendedLayout = UIRectEdgeNone;

答案 6 :(得分:3)

查找此键:UIViewControllerBasedStatusBarAppearance

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

  

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

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

- (void)prefersStatusBarHidden;

答案 7 :(得分:2)

在Swift 2.2中,使用

self.edgesForExtendedLayout = .None

答案 8 :(得分:0)

对我而言,透明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()