iOS7状态栏和inappbrowser(Phonegap Build)

Posted

技术标签:

【中文标题】iOS7状态栏和inappbrowser(Phonegap Build)【英文标题】:iOS7 status bar and inappbrowser (Phonegap Build) 【发布时间】:2014-03-07 03:11:25 【问题描述】:

Apple 要求,在其透明状态栏中没有任何文本滚动。

我在我的 Phonegap Build 应用程序中使用了inAppBrowser 插件,它恰好遇到了这个问题。出于某种原因,inAppbrowser 忽略了我为我的应用设置的背景,只显示状态栏对象后面的网站。

我正在使用StatusBarPlugin 来控制我的状态栏 javascript

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

    // Global InAppBrowser reference
    var iabRef = null;
    function iabLoadStart(event) 
        StatusBar.hide();
    
    function iabLoadStop(event) 
    
    function iabClose(event) 
         StatusBar.show();
         iabRef.removeEventListener('loadstart', iabLoadStart);
         iabRef.removeEventListener('loadstop', iabLoadStop);
         iabRef.removeEventListener('exit', iabClose);
        
    function openPage(url) 
    window.open(url, '_blank', 'location=yes,enableViewportScale=yes,');
    
    // STATUS Bar
    function setStatusBar() 
    StatusBar.show();
    StatusBar.overlaysWebView(false);
    StatusBar.backgroundColorByHexString("#C8DB2F");
    
    // Cordova is ready
    //
    function onDeviceReady() 
         checkConnection();
         setStatusBar();
         iabRef.addEventListener('loadstart', iabLoadStart);
         iabRef.addEventListener('loadstop', iabLoadStop);
         iabRef.addEventListener('exit', iabClose);
    

我看到here提出了类似的问题,但答案并没有解决我的问题。

【问题讨论】:

【参考方案1】:

是的,没错。在 iPhone 上,inAppbrowser 会忽略应用程序本身的定义(Cordova 3.4 / ios 7)。

此外,当它返回应用程序时,它会删除它(在我的定义中,我将状态栏定义为透明并保持在应用程序主体的顶部)。

【讨论】:

有没有办法在它返回应用程序时不擦除它? 找到答案。将“基于视图控制器的状态栏外观”设置为“是”将使状态文本在返回到应用程序时重新出现。 您的回答有效,谢谢。但仍然存在 inAppbrowser 不尊重应用状态栏定义的问题。我会尝试扭转局面,如果可行,我会在这里发布。【参考方案2】:

我找到了解决此问题的方法:您编辑 CDVInAppBrowser.m 文件并在此块中:

if (self = [super init]) 
    // default values
    self.location = YES;
    self.toolbar = YES;
    self.closebuttoncaption = nil;
    self.toolbarposition = kInAppBrowserToolbarBarPositionBottom;

将底部更改为顶部 :-) 还有其他可以做的事情,但这以一种简单的方式解决了问题。

【讨论】:

看起来这只是 iOS【参考方案3】:

当您打开 InAppBrowser 时,您的应用程序及其所有 JS 都会暂停,因此无论您尝试在应用程序中添加多少脚本来控制 IAB,一旦它实际打开,这一切都无关紧要。

但是,如果您将 工具栏位置 选项设置为 顶部,它会将浏览器控件从屏幕底部移动到顶部。浏览器 chrome 将考虑状态栏,当您向上滚动内容时,它将充分隐藏在控件下方。

这是一种 hacky 解决方案,但无需大量编码或重新编写插件即可工作。

怎么做:

在您的 config.xml 文件中,确保您指定了 InAppBrowser 插件:

<gap:plugin name="org.apache.cordova.core.inappbrowser" />

然后无论你在哪里打开浏览器:

window.open('YOUR-URL-HERE', '_blank', 'toolbarposition=top');

您可以在InAppBrowser GitHub readme 中找到更多可自定义的选项。

【讨论】:

这在ios上不起作用,仍然看到状态栏【参考方案4】:

我正在使用 cordova-plugin-inappbrowser 并且在 iOS 中的状态栏上遇到了完全相同的问题。我在这里尝试了一些建议,并尝试使用 insertCSS() 来调整顶部的边距,但似乎都没有效果。最后,安装 org.apache.cordova.statusbar 插件并简单地调用StatusBar.overlaysWebView(false); 解决了这个问题。

您可以阅读有关statusbar plugin here 的更多信息。解决方案由neilsteventon提供。

【讨论】:

你在哪里称呼它?看起来它不会影响 IAB。【参考方案5】:

为了进一步扩展@alexkb,解决方案是钩入InAppBrowser的退出事件,这样当你返回页面后statusBar会正确显示。

myinapp = window.open('YOUR-URL-HERE', '_blank', 'toolbarposition=top');
myinapp.addEventListener('exit', function (event) 
    StatusBar.overlaysWebView(true);
    StatusBar.overlaysWebView(false);
);

【讨论】:

【参考方案6】:

这解决了我在关闭应用内浏览器时隐藏和显示状态栏的问题

var ref = window.open('http://google.com', '_blank');
ref.addEventListener('exit', function(event) 
    StatusBar.hide();
    StatusBar.show();
);

【讨论】:

以上是关于iOS7状态栏和inappbrowser(Phonegap Build)的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 UI 变化:状态栏和导航控制器

iOS 状态栏和 UIView

iOS 7 状态栏和 self.view.frame 和 self.view.bounds

iOS 7,状态栏和导航栏:像 Reeder 一样使用侧面板隐藏或滑动

在 iOS 7 中,状态栏和导航栏出现在我的视图边界上

iOS导航栏和状态栏