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 中