【问题标题】:iOS8 Xcode 6 Cordova Statusbar Not Hiding ProperlyiOS8 Xcode 6 Cordova 状态栏未正确隐藏
【发布时间】: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)。我也尝试过更新相机和状态栏插件。

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

谢谢。

【问题讨论】:

    标签: ios xcode cordova ios8 statusbar


    【解决方案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 状态栏设置。
    • 哦,当覆盖层启动时。我做了一个快速的谷歌,因为我很好奇,发现了这个,stackoverflow.com/questions/18880364/…
    • 感谢您的资源!我想要解决此类插件问题,我们要么必须编辑其源代码并重新编译,要么等到插件使用相应的补丁更新。
    猜你喜欢
    • 2017-10-18
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 2014-11-14
    • 2021-10-11
    • 2015-12-05
    相关资源
    最近更新 更多