视图隐藏在UINavigationBar iOS 7下面

Sal*_*idi 61 iphone uiview navigationbar ios ios7

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

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

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

nul*_*ull 124

试试navigationBar.translucent = NO;,YES默认情况下在iOS7中.

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

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

编辑:

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

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

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

另一个选择是设置:

vc.edgesForExtendedLayout = UIRectEdgeNone;
Run Code Online (Sandbox Code Playgroud)

斯威夫特3:

vc.edgesForExtendedLayout = []
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的解决方案..它确实解决了问题..现在我也明白为什么会发生这种情况:-) (2认同)
  • if([self.navigationBar respondsToSelector:@ selector(setTranslucent :)])不起作用..导致崩溃.我先试过这个.. (2认同)

Dan*_*oad 44

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

self.edgesForExtendedLayout = UIRectEdgeNone;
Run Code Online (Sandbox Code Playgroud)

  • 经过多次头痛之后,这就是最好的方式.谢谢 (2认同)
  • 这也将停止滚动视图,该滚动视图已经以编程方式添加到导航栏/状态栏的下方(而不是下方),以自动更改其内容偏移*,就好像它是*在条形图下面一样. (2认同)

Dav*_*eek 20

Swift 3+:

self.edgesForExtendedLayout = []
Run Code Online (Sandbox Code Playgroud)


小智 11

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

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

设置顶部栏样式

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


Law*_*oot 9

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

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

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


Aks*_*Aks 6

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

self.edgesForExtendedLayout = []
Run Code Online (Sandbox Code Playgroud)

目标C.

self.edgesForExtendedLayout = UIRectEdgeNone;
Run Code Online (Sandbox Code Playgroud)