iOS8 Xcode 6 Cordova 状态栏未正确隐藏

Posted

技术标签:

【中文标题】iOS8 Xcode 6 Cordova 状态栏未正确隐藏【英文标题】:iOS8 Xcode 6 Cordova Statusbar Not Hiding Properly 【发布时间】:2015-01-01 05:28:27 【问题描述】:

在使用 Xcode 5 编译时,我的 Cordova 3.6 应用程序一直使用 StatusBar 插件正常。我调用 StatusBar.hide() 来隐藏整个应用程序的状态栏,并在执行像 Camera 这样的插件后再次隐藏。

但是升级到 Xcode 6(为了兼容 ios 8)后,状态栏在 iOS8 中没有正确隐藏。我设法通过在 Xcode Info.plist 中将“UIViewControllerBasedStatusBarAppearance”设置为“YES”来部分修复它,让 StatusBar 插件进行控制。

但是,像相机这样的插件现在在从相册中选择照片时会自动显示状态栏。选择照片后,我必须再次调用 StatusBar.hide 才能再次隐藏该栏。

以前我在 Xcode 5 中编译并在 iOS8 中运行时,它很好。这个问题只有在我升级 Xcode 之后才出现(可能是 iOS 基本套件一起升级到 8.1)。我也尝试过更新相机和状态栏插件。

如何永久禁用我的应用的状态栏,即使在从相册中选择照片时也将其隐藏?

谢谢。

【问题讨论】:

【参考方案1】:

所以我设法在我的应用程序中隐藏了状态栏,而不再使用工具栏。我正在使用并建议您使用的是钩子。

这是我正在做的事情:

在项目文件夹中,我有以下目录:

_hook_extras 挂钩 合并 平台 插件 回复 www

在 _hook_extras 文件夹中,我有一个 ios 子目录。在该文件夹中是我的 Project-Info.plist。

在我的 plist 文件中我添加了这个:

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

在我的 hooks 文件夹中,我有一个名为 before_compile 的子目录。其中是一个 js 文件,它使用以下代码在编译时将 plist 复制到项目中。

!/usr/bin/env node



var fs = require('fs');
var path = require('path');
var exec = require('child_process').exec;

// no need to configure below
var rootdir = process.argv[2];


var filestocopy = [ 
    "_hook_extras/ios/Project-Info.plist": "platforms/ios/Project/Project-Info.plist"


filestocopy.forEach(function (obj) 
    Object.keys(obj).forEach(function (key) 
        var val = obj[key];
        var srcfile = path.join(rootdir, key);
        var destfile = path.join(rootdir, val);


        // check if the file is a directory
        if (fs.statSync(srcfile).isDirectory()) 


            // make the directory if necessary?
            child = exec("mkdir -p " + destfile, function (error, stdout, stderr) 
                if (error) 
                    console.log(error);
                 else 
                    console.log('Directory ' + destfile + ' created.');
                

                // copy the files to the destination directory
                child = exec("cp -r " + srcfile + " " + destfile, function (error, stdout, stderr) 
                    if (error !== null) 
                        console.log("exec error: " + error);
                     else 
                        console.log("copied " + srcfile + " to " + destfile);
                    
                );
            );

         else 

            console.log("copying " + srcfile + " to " + destfile);
            var destdir = path.dirname(destfile);
            if (fs.existsSync(srcfile) && fs.existsSync(destdir)) 
                fs.createReadStream(srcfile).pipe(
                    fs.createWriteStream(destfile));
            
        
    );
);

【讨论】:

感谢您的建议。我的项目实际上隐藏状态栏没有问题,但它似乎影响了我所依赖的使用相机/相册的 Cordova 插件,例如相机和二维码插件。当这些插件在使用时,会出现状态栏,我必须在插件使用后手动调用状态栏插件再次将其停用。问题是它只在使用新的 Xcode 6 编译时影响应用程序,但在我在 Xcode 5 上编译时不会影响(在运行 iOS 8.1 的同一设备上测试它们)。【参考方案2】:

我尝试了几种解决方案,最终对我有用的是。

我不得不进入我的 plist,改变

View controller-based status bar appearance = YES

然后通过覆盖每个视图控制器中的方法 prefersStatusBarHidden 来控制我的视图控制器中的状态栏,

-(BOOL)prefersStatusBarHidden
    return YES;

【讨论】:

谢谢,实际上我已经尝试过了,但它并没有解决在运行cordova插件(即照片选择)时显示状态栏的问题。我想知道它是否涉及更新插件自己的源代码以适应 iOS 8 状态栏设置。 哦,当覆盖层启动时。我做了一个快速的谷歌,因为我很好奇,发现了这个,***.com/questions/18880364/… 感谢您的资源!我想要解决此类插件问题,我们要么必须编辑其源代码并重新编译,要么等到插件使用相应的补丁更新。

以上是关于iOS8 Xcode 6 Cordova 状态栏未正确隐藏的主要内容,如果未能解决你的问题,请参考以下文章

iOS8 phonegap cordova 网络信息应用程序崩溃

位置栏未出现在 InAppBrowser for iOS、Cordova 中

在 ios 8 中以横向模式隐藏并在 xCode 6 中发布 ios 8 后尝试在 ios 7 中正常工作的状态栏问题

Cordova IOS 8 选择元素

Cordova 和 iOS 8:隐藏状态栏

Swift 中的 Xcode:导航栏未显示在 UI 集合视图(模拟器)中