如何在向下滑动 UIWebView 以修复 iOS7 状态栏覆盖问题后更改 UIWebView 背景颜色?

Posted

技术标签:

【中文标题】如何在向下滑动 UIWebView 以修复 iOS7 状态栏覆盖问题后更改 UIWebView 背景颜色?【英文标题】:How can I change the UIWebView background color after sliding down UIWebView to fix the iOS7 status bar overlay issue? 【发布时间】:2013-10-25 08:56:44 【问题描述】:

我正在编写一个 Phonegap 3.0+ 应用程序。

用户Ludwig Kristoffersson provided a working answer hereios7 中的状态栏重叠视图存在问题

现在我的 UIWebView 的上边距为 20px,如何更改 UIWebView 背景颜色?我需要状态栏后面的区域与“人物”工具栏的背景颜色相同。

我几乎没有 Objective C 方面的经验,并且一直在寻找可能的 SO 问题以找到可行的解决方案,但没有成功。

UIWebView background colorUIWebView background is set to Clear Color, but it is not transparent 以下是我到目前为止尝试过的代码:

- (void)viewWillAppear:(BOOL)animated 
    //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;
        [self.webView setOpaque:YES];

        //neither of these seem to work when uncommented:
  //    [self.webView setBackgroundColor:[UIColor grayColor]];
  //    self.webView.backgroundColor=[UIColor grayColor];
        
    [super viewWillAppear:animated];
    


更新 1

- (void)viewWillAppear:(BOOL)animated

//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;

    self.webView.backgroundColor = [UIColor grayColor];
    self.webView.opaque=NO;

[super viewWillAppear:animated];

这似乎仍然给了我状态栏后面的白色背景,而不是灰色。

我希望的结果是这样的:

【问题讨论】:

【参考方案1】:

将 Opaque 属性更改为 NO 并像这样检查:

self.webView.backgroundColor = [UIColor grayColor];
self.webView.opaque=NO;

它对我来说很好用。

【讨论】:

请看我上面的“更新1” 更改颜色并检查/ 奇怪...我更改为 grayColor 和 greenColor 只是为了测试。我曾多次尝试在我的 iPad、iPhone 和模拟器上清理项目,但只能让背景显示为白色。会不会是 Phonegap 稍后在某个地方设置的东西? 您是否以编程方式添加 Web 视图? 此代码将在加载 URL 时设置 Web 视图的背景颜色。一旦内容被加载到 Web 视图中,Web 视图背景将根据 URL 内容发生变化。【参考方案2】:

所以我意识到代码将 UIWebView 向下推 20px。这意味着根据定义,空格不能是 UIWebView。空白是我通过执行以下操作更改背景颜色的主视图:

1.转到 MainViewController.xib:2.选择主视图:3.显示属性检查器并更改颜色。完成。 现在想起来很明显,但希望这对将来的人有所帮助。

【讨论】:

【参考方案3】:

这适用于 Cordova 3 和 Cordova 2.9

因此,在您通过 CSS 设置应用的背景颜色后,如下所示:

 body
   background-color: #000;
 

转到您的 CordovaXlib.xcode.proj 并查找您的“类”文件夹 主视图控制器.m 第 142 行

取消注释“webViewDidStartLoad”方法或函数并添加

  self.webView.opaque=NO;

所以你会有这样的东西:

 - (void) webViewDidStartLoad:(UIWebView*)theWebView
 
    self.webView.opaque=NO;
    return [super webViewDidStartLoad:theWebView];
 

【讨论】:

【参考方案4】:

Cordova 3.5 在MainViewController.m(void)webViewDidFinishLoad:(UIWebView*)theWebView 中设置背景颜色:

theWebView.backgroundColor = [UIColor blackColor];

成功更改或注释掉该行允许我更改 web 视图后面的 iOS 屏幕的颜色。

感谢bar54 描述此解决方案。

【讨论】:

【参考方案5】:

或者,在 UIWebView 内的 html 正文上设置 20px 的边距,然后在 CSS 中设置的背景颜色将一直到顶部。

function onDeviceReady() 
    if (parseFloat(window.device.version) === 7.0) 
          document.body.style.marginTop = "20px";
    


document.addEventListener('deviceready', onDeviceReady, false);

请注意,您的应用需要添加设备插件才能正常工作。

【讨论】:

谢谢山姆。这就是我最初使用的。我的一些视图的性质(可滚动,文本区域也可滚动)意味着额外的正文边距有时会向上滑动。我尝试将溢出-y 设置为隐藏,但仍然无法绕过它。感谢您的意见。【参考方案6】:

添加以下 CSS 定义:

#ios7statusbar 
  width:100%;
  height:20px;
  background-color:white;
  position:fixed;
  z-index:10000;

.ios7 .ui-page, .ios7 .ui-header, .ios7 .ui-pane 
  margin-top: 20px;

在您的应用初始化中添加基于 javascript 的用户代理检测:

if (navigator.userAgent.match(/(iPad.*|iPhone.*|iPod.*);.*CPU.*OS 7_\d/i)) 
  $("body").addClass("ios7");

【讨论】:

以上是关于如何在向下滑动 UIWebView 以修复 iOS7 状态栏覆盖问题后更改 UIWebView 背景颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖 UIWebView 中的滑动手势?

自定义通知覆盖 - 实现向下滑动以显示几个按钮

向下滑动以关闭时,SafariViewControllerDidFinish 不会触发

UIWebView 向下滚动

iOS开发之UIWebView自动滑动到顶部-备

禁用滑动以在 UIWebView 上滚动但保留拖动/平移