iOS 7状态栏重叠UI

我最近升级到xcode 5,当我在iOS模拟器中运行我的应用程序时,启动屏幕与状态栏重叠,当您在应用程序中时,状态栏与我的应用程序上的元素重叠,就像我左上angular的后退button我的应用程序的手angular。 我使用phonegap 2.9构build我的应用程序。 任何想法如何我可以得到这个呈现正确。

闪屏

UI

如果您正在使用故事板,则可以解决此问题,如以下问题所示: iOS 7 – 状态栏与视图重叠

如果你不使用storyboard,那么你可以在你的AppDelegate.m中使用这个代码did finishlaunching

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { [application setStatusBarStyle:UIStatusBarStyleLightContent]; self.window.clipsToBounds =YES; self.window.frame = CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20); } 

也看到这个问题: iOS7中的状态栏和导航栏问题

MainViewController.m里面: - (void)viewWillAppear:(BOOL)animated add this:

 //Lower screen 20px on ios 7 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { CGRect viewBounds = [self.webView bounds]; viewBounds.origin.y = 18; viewBounds.size.height = viewBounds.size.height - 18; self.webView.frame = viewBounds; } 

所以最终的function如下所示:

 - (void)viewWillAppear:(BOOL)animated { // View defaults to full size. If you want to customize the view's size, or its subviews (eg webView), // you can do so here. //Lower screen 20px on ios 7 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { CGRect viewBounds = [self.webView bounds]; viewBounds.origin.y = 18; viewBounds.size.height = viewBounds.size.height - 18; self.webView.frame = viewBounds; } [super viewWillAppear:animated]; } 

我通常做的是将两个键值属性添加到Info.plist文件。

在这里输入图像描述

属性源代码是:

在这里输入图像描述

我有一个问题打开inApp浏览器与phonegap。 Gimi的解决scheme运行良好,但每次打开inApp浏览器时,屏幕都会缩小。 所以我添加了一个if语句来检查webview的y原点是否为0,inApp浏览器不再有y原点0,所以它解决了我的问题。

 // ios 7 status bar fix - (void)viewWillAppear:(BOOL)animated { // View defaults to full size. If you want to customize the view's size, or its subviews (eg webView), // you can do so here. //Lower screen 20px on ios 7 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { if(self.webView.frame.origin.y == 0) { CGRect viewBounds = [self.webView bounds]; viewBounds.origin.y = 20; viewBounds.size.height = viewBounds.size.height - 20; self.webView.frame = viewBounds; } } [super viewWillAppear:animated]; } 

解决scheme不是真的,但我找不到源。 希望它有帮助!

把这个代码片段放在PhoneGap项目的MainViewController.m文件中。

 - (void)viewDidLayoutSubviews{ if ([self respondsToSelector:@selector(topLayoutGuide)]) // iOS 7 or above { CGFloat top = self.topLayoutGuide.length; if(self.webView.frame.origin.y == 0){ // We only want to do this once, or // if the view has somehow been "restored" by other code. self.webView.frame = CGRectMake(self.webView.frame.origin.x, self.webView.frame.origin.y + top, self.webView.frame.size.width, self.webView.frame.size.height-top); } } } 

我在ViewDidLoad方法中使用这个代码。

  if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) { self.edgesForExtendedLayout = UIRectEdgeNone; } 

这也适用于以前的iOS版本。

事实上,我发现Gimi的答案是最好的答案,我一直在寻找很多! 只需要添加Gimi的回答,并回答Ignacio-munizaga对该答案的回复,代码将在视图出现时执行,这意味着在closures内嵌浏览器之后或者在相机滚动等之后,我只是将一个bool值声明尺寸是否已经调整。

最终的代码如下所示:

 bool sizeWasAdjusted = false; - (void)viewWillAppear:(BOOL)animated { // View defaults to full size. If you want to customize the view's size, or its subviews (eg webView), // you can do so here. //Lower screen 20px on ios 7 if (!sizeWasAdjusted && [[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { CGRect viewBounds = [self.webView bounds]; viewBounds.origin.y = 18; viewBounds.size.height = viewBounds.size.height - 18; self.webView.frame = viewBounds; sizeWasAdjusted = true; } [super viewWillAppear:animated]; } 

尝试进入XCode中的应用程序的(app name)-Info.plist文件并添encryption钥

 view controller-based status bar appearance: NO status bar is initially hidden : YES 

这似乎对我没有任何问题。

如果你开发的iOS 7我不会build议包装在一个黑色的矩形旧的iOS风格的状态栏。 只需将其集成到devise中即可获得更多iOS 7“全屏”外观。

您可以使用此插件来调整状态栏的墨水颜色,或将其隐藏或显示在应用程序的任何实例中。

https://github.com/jota-v/cordova-ios-statusbar

JS的方法是:

 window.plugins.statusBar.hide(); window.plugins.statusBar.show(); window.plugins.statusBar.blackTint(); window.plugins.statusBar.whiteTint(); 

重要提示:同样在你的应用程序plist文件中设置UIViewControllerBasedStatusBarAppearanceNO

最好在info.plist中有这个东西

 <key>UIStatusBarHidden</key> <true/> <key>UIViewControllerBasedStatusBarAppearance</key> <false/> 

这根本没有状态栏。

为了解决iOS7状态栏的问题,我们可以使用下面的代码给Cordova / PhoneGap:

 function onDeviceReady() { if (parseFloat(window.device.version) === 7.0) { document.body.style.marginTop = "20px"; } } document.addEventListener('deviceready', onDeviceReady, false); 

无论如何cordova3.1将很快解决这个和其他问题的iOS7。

  if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { self.window.clipsToBounds =YES; [application setStatusBarStyle:UIStatusBarStyleLightContent]; self.window.frame = CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20); } 

从Apple iOS7转换指南 ,

特别,

 self.automaticallyAdjustsScrollViewInsets = YES; self.edgesForExtendedLayout = UIRectEdgeNone; 

为我工作,当我不想重叠,我有一个UITableViewController。

如果您正在使用Sencha Touch的Cordova,并使用正常的Sencha Touch导航/标题栏,则只需拉伸导航栏并重新定位导航栏中的内容,以便在iOS 7中查看家中的内容即可。只需将其添加到app.js (最后一个Ext.Viewport.add行之后):

 // Adjust toolbar height when running in iOS to fit with new iOS 7 style if (Ext.os.is.iOS && Ext.os.version.major >= 7) { Ext.select(".x-toolbar").applyStyles("height: 62px; padding-top: 15px;"); } 

(来源: http : //lostentropy.com/2013/09/22/ios-7-status-bar-fix-for-sencha-touch-apps/ )

我知道这有点不好意思,但是可以在Objective-C级别处理它。 尽pipe如此,对那些不使用Sencha Touch的人来说也不算什么好处。

didFinishLaunchingWithOptions事件的AppDelegate.m中写入以下代码(恰好在其最后一行代码“ return YES; ”之前):

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { [application setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; } 

我会等待您的反馈! 🙂

在.plist文件集属性中:

 <key>UIViewControllerBasedStatusBarAppearance</key> <false/> 

它隐藏了statusBar。

您可以使用的最佳方法是调整主视图的大小,特别是如果您的应用程序使用页脚。

在MainViewController.m上使用viewDidLoad方法,在[super viewDidLoad];

 NSArray *vComp = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."]; if ([[vComp objectAtIndex:0] intValue] >= 7) { // iOS 7 or above CGRect oldBounds = [self.view bounds]; CGRect newViewBounds = CGRectMake( 0, -10, oldBounds.size.width, oldBounds.size.height-20 ); CGRect newWebViewBounds = CGRectMake( 0, -20, oldBounds.size.width, oldBounds.size.height-40 ); [self.view setBounds:newViewBounds]; [self.webView setBounds:newWebViewBounds]; } 

那么你将不需要修改任何JavaScript到你的应用程序

随着iOS 7.0.4的发布,iOS7修补程序在我当前的项目中破裂了,因为7.0.4不能修复。 因此,如果运行次要版本3或更less,添加一个小的控制来运行它。

 NSArray *vComp = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."]; if ([[vComp objectAtIndex:0] intValue] == 7 && [[vComp objectAtIndex:1] intValue] == 0 && [[vComp objectAtIndex:2] intValue] <= 3 ) { CGRect oldBounds = [self.view bounds]; CGRect newViewBounds = CGRectMake( 0, -10, oldBounds.size.width, oldBounds.size.height-20 ); CGRect newWebViewBounds = CGRectMake( 0, -20, oldBounds.size.width, oldBounds.size.height-40 ); [self.view setBounds:newViewBounds]; [self.webView setBounds:newWebViewBounds]; } 

我开始走这条路线,但我有我自己的导航控制core view ,我滑入一个框架,通常包装核心与一个共同的标题栏和tabbar栏; 没有storyboard ,没有UINavigationController

它开始变得很复杂,加减了状态栏的20个像素。 然后是一个顿悟。

我制作了一个.xib file的副本,告诉Xcode以iOS 7的布局向我展示,重新整理了所有内容,并且将一个6/7的开关放在代码中。瞬间,一切正常,只有额外的资源才添加8K到捆绑。

我们也可以在我们的js文件中检查这个

 if (parseFloat(window.device.version) >= 7.0) { $("body").addClass("ios7"); } 

在.css文件中为此定义一个类

  .ios7 .ui-page, .ios7 .ui-header, .ios7 .ui-pane { margin-top: 17px !important; } 

我首先为iOS7开发,但为了与iOS6保持兼容,我的确和Gimibuild议的相反 – 在MainViewController.m我将y原点设置为20px,并将视图高度增加20px:

 //Lower screen 20px on ios 7 if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) { CGRect viewBounds = [self.webView bounds]; viewBounds.origin.y = -20; viewBounds.size.height = viewBounds.size.height + 20; self.webView.frame = viewBounds; } 

非常感谢的人。 它工作得很好:

MAC OS X 10.9.1Xcode 5.0.2cordova 3.3jQuery mobile 1.3.2

这是我使用CSS和Javascript的方法:

1)在CSS中定义以下内容:

 #ios7-statusbar-fix { width:100%; height:20px; background-color:white; position:fixed; z-index:10000; margin-top:-20px; display:none; } 

2)添加这个ID作为第一个元素的div容器在<body> -tag之后:

 <body> <div id="ios7-statusbar-fix"></div> … 

3)过滤iOS 7设备并通过Javascript应用更改:

 if (navigator.userAgent.match(/(iPad.*|iPhone.*|iPod.*);.*CPU.*OS 7_\d/i)) { document.body.style.marginTop = '20px'; document.getElementById('ios7-statusbar-fix').style.display = 'block'; } 

上面的一些答案会给你一个黑色的顶部,如果你设置你的屏幕绑定20px,其他将继续减less你的webview屏幕,如果你使用webview.frame.size.height -20px; 试试这个,然后,它适用于任何ios,不需要更改css,放在里面

 - (void)webViewDidFinishLoad:(UIWebView*)theWebView { 

//是否是IOS7以上

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { 

//获取设备的屏幕大小

  CGRect screenBounds = [[UIScreen mainScreen] bounds]; 

//将高度减小20px

  int x= screenBounds.size.height -20; 

//设置webview top pos 20px,所以它位于状态栏下方,缩小20px

  [theWebView setFrame:CGRectMake(0, 20, theWebView.frame.size.width, x )]; } 

对于iPhoneX

对于上面所有的答案:

iPhoneX中状态栏的高度是44而不是20