iOS 7状态栏重叠UI
我最近升级到xcode 5,当我在iOS模拟器中运行我的应用程序时,启动屏幕与状态栏重叠,当您在应用程序中时,状态栏与我的应用程序上的元素重叠,就像我左上angular的后退button我的应用程序的手angular。 我使用phonegap 2.9构build我的应用程序。 任何想法如何我可以得到这个呈现正确。
如果您正在使用故事板,则可以解决此问题,如以下问题所示: 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文件中设置UIViewControllerBasedStatusBarAppearance
为NO 。
最好在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.1
– Xcode 5.0.2
– cordova 3.3
– jQuery 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
- 错误:无法读取构buildiOS Cordova时未定义的属性“replace”
- 我可以Fastclick在cordova运行的ReactJS
- 自定义对象上的addEventListener
- 使用Bootstrap 3,jQuery和phonegap的移动应用程序,可以吗?
- PhoneGap – android的退出button
- Phonegap Android后退button – 在主页上closures后退button的应用程序
- phonegap应用程序可以在后台工作吗?
- 如果最终使用PhoneGap,为什么要使用IBM Worklight?
- 应用程序错误 – 到服务器的连接不成功。 (文件:///android_asset/www/index.html)