Cordova 3.5.0 中的 iPhone 屏幕方向没有改变
Posted
技术标签:
【中文标题】Cordova 3.5.0 中的 iPhone 屏幕方向没有改变【英文标题】:iPhone screen orientation doesn't change in cordova 3.5.0 【发布时间】:2014-07-31 08:48:23 【问题描述】:当我使用 iPhone 在我的应用程序中旋转屏幕时,它始终保持纵向并且没有任何变化。但是它适用于 iPad。我可以旋转它并改变方向。
如何让我的 App 在 iPhone 转动时改变屏幕方向?
在 config.xml 我有:
<preference name="Orientation" value="default" />
我能找到的唯一解决方案是在科尔多瓦代码中的 MainViewController.m 中更改方法 shouldAutorotateToInterfaceOrientation:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
// Return YES for supported orientations
-- return [super shouldAutorotateToInterfaceOrientation:interfaceOrientation];
++ return true;
但这对我来说似乎是一个丑陋的解决方案,我真的很想找到这样做的正常方法。
理想情况下,除了 PortraitUpsideDown 之外,iPad 和 iPhone 的所有方向都很好,但我不知道我是否可以梦想它。
还有其他人对 iPhone 和 cordova 有类似的问题吗?我已经用谷歌搜索了好几天了,除了科尔多瓦代码中的这个 hack 之外什么都找不到。
【问题讨论】:
这是一个 javascript 解决方案:***.com/a/28203969/533454 【参考方案1】:在广泛搜索此问题的解决方案后,不幸的是,我得出的结论是这是一个 Cordova 问题。
<preference name="Orientation" value="default" />
代码实际上应该更改 ios 配置文件 (/platform/ios/~app_name~/~app_name~.plist) 中的平台 UISupportedInterfaceOrientations 键以包含以下值:
"UIInterfaceOrientationLandscapeLeft"; "UIInterfaceOrientationLandscapeRight"; "UIInterfaceOrientationPortrait";和(我认为) “UIInterfaceOrientationPortraitUpsideDown”不幸的是,更改 config.xml 文件并不会更改 plist 文件,这很烦人。希望这能很快得到解决,从网上找到的线程来看,这浪费了很多人寻找解决方案的时间。
我找到的最简单的解决方案是手动更改 ~app_name~.plist 文件以包含上述值。我一直在 Xcode 中这样做,这很容易做到。
希望这会有所帮助。如果有更好的解决方案或 Cordova 解决了这个疏忽,请告诉我。
【讨论】:
作为旁注,值得注意的是其他哪些 config.xml 选项不起作用。有其他的请留言,以免浪费更多时间...... 我不喜欢修改 Cordova 生成的代码。这是一个 Javascript 解决方案。 ***.com/a/28203969/533454【参考方案2】:我在 XCode 中创建了一个使用 PListBuddy 的构建阶段,这样每当您运行 cordova build ios
时,它就会运行构建阶段并更新 PList 文件。这样做的好处是,如果您更改 config.xml 并更改 PList,则构建阶段会介入并确保值存在。
我从这里接受的答案中得到了这个想法:Is there a way of automatically writing custom values to the bundle's .plist during a build phase?
#Grabs info from plist
plist=$SRCROOT"/"$INFOPLIST_FILE
orientations=`/usr/libexec/PlistBuddy -c "Print :UISupportedInterfaceOrientations" "$plist"`
#And changes it before writing out the plist again
if [ "$orientations" ]
then
/usr/libexec/PlistBuddy -c "Delete :UISupportedInterfaceOrientations array" "$plist"
fi
/usr/libexec/PlistBuddy -c "Add :UISupportedInterfaceOrientations array" "$plist"
/usr/libexec/PlistBuddy -c "Add :UISupportedInterfaceOrientations:0 string \"UIInterfaceOrientationPortrait\"" "$plist"
/usr/libexec/PlistBuddy -c "Add :UISupportedInterfaceOrientations:0 string \"UIInterfaceOrientationPortraitUpsideDown\"" "$plist"
/usr/libexec/PlistBuddy -c "Add :UISupportedInterfaceOrientations:0 string \"UIInterfaceOrientationLandscapeLeft\"" "$plist"
/usr/libexec/PlistBuddy -c "Add :UISupportedInterfaceOrientations:0 string \"UIInterfaceOrientationLandscapeRight\"" "$plist"
顺便说一句,我们不应该为了吃蛋糕而费尽心机,但无论如何。
【讨论】:
这真的很酷,谢谢。我正在做一些烦人的字符串替换,以尽可能地自动化我的构建,但这更好【参考方案3】:我创建了一个从这里引用的挂钩文件: https://***.com/a/27063466/4519033
#!/usr/bin/env node
var fs = require('fs');
var plist = 'platforms/ios/<app-name>/<app-name>-Info.plist';
var iphoneModes = [
"UIInterfaceOrientationLandscapeLeft",
"UIInterfaceOrientationLandscapeRight",
"UIInterfaceOrientationPortrait"
];
var ipadModes = [
"UIInterfaceOrientationLandscapeLeft",
"UIInterfaceOrientationLandscapeRight"
];
function getOrientationModeStr(modes)
var s = "<key>$1</key>\n\t<array>\n\t";
modes.forEach(function(mode, index)
s += "\t<string>"+mode+"</string>\n\t";
);
return s;
if (fs.existsSync(plist))
var p = fs.readFileSync(plist, 'utf8');
// replace iphone modes
p = p.replace(
/<key>(UISupportedInterfaceOrientations)<\/key>[\r\n ]*<array>[\s\S]*?(?=<\/array>)/ig,
getOrientationModeStr(iphoneModes)
);
// replace ipad modes
p = p.replace(
/<key>(UISupportedInterfaceOrientations~ipad)<\/key>[\r\n ]*<array>[\s\S]*?(?=<\/array>)/ig,
getOrientationModeStr(ipadModes)
);
fs.writeFileSync(plist, p, "utf8");
希望它有所帮助。
【讨论】:
以上是关于Cordova 3.5.0 中的 iPhone 屏幕方向没有改变的主要内容,如果未能解决你的问题,请参考以下文章
Cordova 3.5.0 iOS 应用程序中的暂存文件夹需要啥?
无法在 Phonegap / Cordova 3.5.0-0.2.4 上运行联系人插件
Cordova 应用程序无法在 iPhone X(模拟器)上正确显示
css Cordova Chrome Apps中的全屏背景,使用背景大小:封面