我最近下载了Xcode 5 DP来测试我在iOS 7中的应用程序 . 我注意到并确认的第一件事是我的视图边界并不总是调整大小来考虑状态栏和导航栏 .
在 viewDidLayoutSubviews
中,我打印视图的边界:
{{0,0},{320,568}}
这导致我的内容出现在导航栏和状态栏下方 .
我知道我可以通过获取主屏幕的高度,减去状态栏的高度和导航栏的高度来解释自己的高度,但这似乎是不必要的额外工作 .
我该如何解决这个问题?
Update:
我找到了解决这个特定问题的方法 . 将导航栏的半透明属性设置为NO:
self.navigationController.navigationBar.translucent = NO;
这将修复视图在导航栏和状态栏下面的框架 .
但是,当您希望导航栏为半透明时,我还没有找到针对该案例的修复程序 . 例如,全屏查看照片,我希望导航栏是半透明的,并且要在其下面构建视图 . 这是有效的,但当我切换显示/隐藏导航栏时,我经历了甚至更奇怪的结果 . 第一个子视图(UIScrollView)每次都会更改其边界 .
20 回答
我以编程方式创建了我的视图,最终为我工作:
Source(在第39页底部的 topLayoutGuide 部分) .
edgesForExtendedLayout
为iOS 7提供了技巧 . 但是,如果您在iOS 7 SDK中构建应用程序并将其部署在iOS 6中,导航栏将显示为半透明且视图位于其下方 . 因此,要为iOS 7和iOS 6修复它,请执行以下操作:Swift 3
最简单的技巧是打开NIB文件并执行以下两个简单步骤:
并 the result :
只需在视图中设置以下代码即可出现 .
步骤隐藏iOS 7中的状态栏:
1.转到您的应用程序info.plist文件 .
2.And Set,View基于控制器的状态栏外观:布尔值NO
希望我解决状态栏问题.....
我想扩展Stunner的答案,并添加一个
if
语句来检查它是否是iOS-7,因为当我在iOS 6上测试它时我的应用程序会崩溃 .增加的内容是:
所以我建议将此方法添加到
MyViewControler.m
文件中:对我来说,最简单的解决方案是在plist中添加两个键
我有一个场景,我使用Apple编写的BannerViewController来显示我的广告和嵌入在BannerViewController中的ScrollViewController .
为防止导航栏隐藏我的内容,我不得不做两处更改 .
1)修改BannerViewController.m
2)修改我的ScrollViewContoller
现在,广告在视图底部正确显示,而不是被导航栏覆盖,并且顶部的内容不会被切断 .
iPad(armv7,armv7s,amr64)我的应用程序遇到了同样的问题,只是通过呈现另一个UIViewController并在解除它们后,状态栏下的导航栏...我花了很多时间找到任何解决方案 . 我正在使用storyboard和在InterfaceBuilder中使用UIViewController,这让我很糟糕,我从FullScreen设置了Presentation - > Current Context并解决了这个问题 . 它适用于我的应用程序仅适用于iPad => iOS8.0(使用iOS8.1测试)和适用于iOS 7.1的iPad无法正常工作!!
Swift 4.2 - Xcode 10.0 - iOS 12.0:
在您的应用程序plist文件中添加一行,将其命名为"View controller-based status bar appearance"并将其设置为NO .
在我的情况下,loadView()中断
此代码:self.edgesForExtendedLayout = UIRectEdgeNone
但删除loadView()后一切正常
像这样对Top Layout进行约束
将下拉列表中的键"View Controller-based status bar appearance"添加为
info.plist
中的一行 . 像这样的东西:Swift解决方案:
Swift 3 / Swift 4解决方案也适用于iOS 10中的NIB / XIB文件:
您可以通过在iOS7 SDK中实现名为
edgesForExtendedLayout
的新属性来实现此目的 . 请添加以下代码来实现此目的,您需要在
-(void)viewDidLoad
方法中添加上述内容 .请参考,apple doc
你不必计算将所有东西都降下来的距离,这里有一个属性 . 在Interface Builder中,突出显示视图控制器,然后导航到属性检查器 . 在这里,您会看到“Extend Edges”字样旁边的一些复选框 . 正如您所看到的,在第一个屏幕截图中,默认选择是内容显示在顶部和底部条形下,而不是在不透明条形下,这就是为什么将条形样式设置为不半透明的原因 .
正如您在第一个屏幕截图中看到的那样,导航栏下方隐藏了两个UI元素 . (我在IB中启用了线框来说明这一点)这些元素,UIButton和UISegmentedControl都将其“y”原点设置为零,并且视图控制器设置为允许顶部栏下方的内容 .
第二个屏幕截图显示取消选中“Under Top Bars”复选框时会发生什么 . 如您所见,视图控制器视图已正确向下移动,其y原点位于导航栏下方 .
这也可以通过
-[UIViewController edgesForExtendedLayout]
的使用以编程方式完成 . 这是edgeForExtendedLayout的类引用的链接,以及UIRectEdge的链接如果您希望视图具有半透明导航栏(这很好),您必须设置contentInset或类似 .
我是这样做的: