Phonegap景观未检测到90和-90的方向

时间:2013-11-12 12:43:34

标签: ios cordova landscape

我的iOS应用程序使用横向模式时遇到问题。 我是手机,iOS,Mac和大部分内容的新手,但现在已经在网上搜索了几天,我需要帮助。

我正在使用xcode 5,phonegap 2.3.0,我的目标是iPhone iOS 7。

我有一个正在制作的应用,我需要给它一些景观支持。 在特定情况下,应该可以倾斜手机并获得更好的视野。

我找到了这段代码:

window.addEventListener('orientationchange', doOnOrientationChange,true);

function doOnOrientationChange(e)
{
    alert('orientation event fire');
    switch(e.orientation)
    {
        case -90:
        case 90:
            alert('landscape');
            break;
        default:
            alert('portrait');
            break;
    }
}

我也可以使用window.orientation而不是e.orientation。 这种接缝是处理这些东西的流行方式。

出于某种原因,仅在手机180度并且返回0时才会调出“方向事件触发”警报。在90或-90时不会发生任何事件。

我在xcode中将支持的界面方向设置为所有4种可能性。 在我的index.html中,我有:

<meta name="viewport" content="user-scalable=yes, width=device-width" />

我可以让应用程序以横向模式启动,但在应用程序运行后不会更改为应用程序。 它可以改回肖像模式就好了。

出于某种原因,手机在90和-90时没有告诉我。

我读到它不是处理旋转的phonegap,而是phonegap使用的浏览器。这是我正在寻找的行为,因为我希望浏览器在手机倾斜时为我调整大小并旋转所有内容。

此外,我不愿意更新phonegap,因为我已经阅读了很多关于它在版本2.3.0之后处理旋转不良的帖子

任何想法??

修改

有时,只有在论坛上提出问题后,答案才会出现。

我的问题是我公司的另一位开发人员添加了:

function shouldRotateToOrientation(interfaceOrientation) {
    return app.shouldRotateToOrientation( interfaceOrientation );
}

到我的index.js文件。

显然,shouldRotateToOrientation函数是phonegap在代码中查找的函数,如果有,则限制屏幕旋转。

我尝试写以下内容:

function shouldRotateToOrientation(interfaceOrientation) {
    return true;//(1 === interfaceOrientation);
}

一切都很好......或者还有一件事

下一个问题是找到当前的方向。 显然,传递给shouldRotateToOrientation的值将指示当前方向。 (在我的情况下是interfaceOrientation) 一些写1表示肖像,2,3,4表示其他方向。 有人写它返回0,90,-90,180。(在我的情况下,我发现最后一个是真的。) 然而,它在每个方向转换时调用该函数4次。 因此,将console.log放入该功能将导致每次手机倾斜时打印4行。 打印线的顺序在每种情况下都是相同的,因此无法确定手机实际转向的方式。

有人将此作为解决方案:

function changeOrientation() {
    console.log(window.orientation);
}
window.onorientationchange = function () {
    //Need at least 800 milliseconds
    setTimeout(changeOrientation, 800);
}

但这只是在屏幕实际改变方向时调用,我需要告诉我手机转向的方式,所以我可以决定是否允许更改方向。 还有点烦人的是,它需要等待800毫秒。

知道如何获取手机的当前实际方向。不是应用程序呈现的方向?

修改 我最终使用了:

function shouldRotateToOrientation(newOrientation) {
    return window.app.supportLandscape || !(interfaceOrientation%180);
}

为了限制屏幕,即使newOrientation值遍布整个地方,它仍然有效。 window.app.supportLandscape是在我的代码中设置的,我想支持横向或不支持横向。 !(interfaceOrientation%180)部分允许我在所有情况下旋转回肖像。 如果我去一个允许风景的屏幕。 我转动手机进入横向模式。 然后我按下后退按钮返回到只应处于纵向模式的页面。 我在横向模式下看到此页面(无法帮助) 我将手机恢复为纵向模式,屏幕再次处于纵向模式,并锁定到此模式。

我面临的下一个问题是设备横向屏幕不会被重新渲染。 图形转动但不能缩放以适应屏幕。 仅当我使用Archive生成.ipa文件并通过iTunes部署它时,才会出现此问题。 当从xcode 5直接启动到设备或任何模拟器时,图形将适合在横向模式下缩放。

我发现帖子说问题是xcode使用不同的设置生成.ipa文件而不是启动代码。这是正确的,因为xcode在启动时使用调试,在归档时使用。 我试图设置存档模式以使用调试但同样的问题。 我试图将run设置为release但它仍然正常工作。

任何想法???

2 个答案:

答案 0 :(得分:0)

在Xcode 5中,选择目标,单击“信息”选项卡,确保选择了“支持的界面方向”。就我而言,Phonegap CLI生成了一个项目,该项目只将Portrait添加到方向列表中 - 即使我在config.xml中指定了Landscape

截图: http://i.stack.imgur.com/Bi8RC.png

答案 1 :(得分:0)

使用本机代码作为插件广告使用javascript调用它。也可以在config.xml中添加它。并在CDViewController中更改自动旋转 - 返回NO。如果您想要详细的解决方案,请告诉我。我已经解决了同样的问题。

更新:我的解决方案

创建一个新的js文件作为ScreenOrientation.js并插入以下代码

var ScreenOrientation = {
   //alert(orientation);
callScreenOrientationNative: function(success,fail,orientation) {
   return Cordova.exec( success, fail,
                       "ScreenOrientation",
                       "screenorientationFunction",
                       [orientation]);
}
};

并在index.html中添加上述文件,如下所示,

<script type="text/javascript" src="ScreenOrientation.js"></script>

在任何添加的js文件中添加以下函数(在我的项目中,我添加了一个script.js文件来添加常用函数),

function callScreenOrientation(orientation) {
   ScreenOrientation.callScreenOrientationNative(nativePluginResultHandler,nativePluginErrorHandler,orientation);
}

function nativePluginResultHandler (result) {
}

function nativePluginErrorHandler (error) {
}

在config.xml中添加以下功能名称

<!-- Screen Orientation custom plugin to display reports page. -->
   <feature name="ScreenOrientation">
       <param name="ios-package" value="ScreenOrientation"/>
   </feature>

在插件下添加(对于cordova&lt; 3.0),

<plugins>
    <plugin name="ScreenOrientation" value="ScreenOrientation" />
</plugins>

在Cordova项目上&gt;插件右键单击并选择新文件,然后从iOS选择Cocoa touch然后选择objective-C Class并单击next,在类名称insert&#34; ScreenOrientation&#34;在&#34; CDVPlugin&#34;的子类中然后单击“下一步”并单击“创建”。

在ScreenOrientation.h中输入以下内容,

#import <Cordova/CDV.h>

@interface ScreenOrientation : CDVPlugin

- (void) screenorientationFunction:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;

@end

在ScreenOrientation.m中输入以下内容,

#import "ScreenOrientation.h"

@implementation ScreenOrientation

- (void) screenorientationFunction:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options {
   [arguments pop];

   NSString *orientation = [arguments objectAtIndex:0];

   if ( [orientation isEqualToString:@"LandscapeLeft"] ) {
       NSLog(@"Landscape Left");
        [[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationLandscapeLeft];
   }
   else if ( [orientation isEqualToString:@"LandscapeRight"] ) {
       NSLog(@"Landscape Right");
       [[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationLandscapeRight];
   }
   else if ( [orientation isEqualToString:@"Portrait"] ) {
       NSLog(@"Portrait");
       [[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationPortrait];
   }
   else if ( [orientation isEqualToString:@"PortraitUpsideDown"] ) {
       NSLog(@"Portrait upSide Down Left");
       [[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationPortraitUpsideDown];
   }
}

@end

在Cordova项目中点击搜索并搜索&#34; shouldAutoRotate并找到以下内容并更改返回,默认情况下它将是&#39; YES&#39;将其更改为“否”&#39;

<强> CDVViewController.m

- (BOOL)shouldAutorotate
{
    return NO;
}

在项目设置中,在设备方向中检查所有选项(尽管不重要),

Project Settings > Device orientation > Tick all 4 options.

并从您的项目中调用它,

callScreenOrientation('LandscapeLeft');
callScreenOrientation('LandscapeRight');
callScreenOrientation('Portrait');
callScreenOrientation('PortraitUpsideDown');