ios - Phonegap横向未检测到90和-90的方向

标签 ios cordova landscape

我在让我的iOS应用程序使用横向模式时遇到问题。
我对Phonegap,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,因为我已经阅读了很多有关版本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)部分允许我在所有情况下旋转回纵向。
如果我去的屏幕是风景。
我打开手机,进入横向模式。
然后,我按“后退”按钮并返回到仅处于纵向模式的页面。
我在横向模式下看到此页面(无法帮助)
我将手机转回纵向模式,屏幕现在再次处于纵向模式,并锁定为该模式。

我面临的下一个问题是在设备横向屏幕上没有重新呈现。
图形会旋转,但无法缩放以适合屏幕。
仅当我使用存档生成.ipa文件并通过iTunes部署它时,此行为才出现。
当直接从xcode 5启动到设备或任何模拟器时,图形将适合在横向模式下缩放。

我发现有一篇帖子说问题是xcode使用不同的设置来生成.ipa文件,而不是启动代码。这是正确的,因为xcode在启动时使用调试,而在归档时使用释放。
我试图将存档模式设置为使用调试,但存在相同的问题。
我试图设置运行以发布,但它仍然可以正常工作。

有任何想法吗 ???

最佳答案

使用本机代码作为插件广告,请使用javascript对其进行调用。还要将其添加到config.xml中。并在CDViewController中更改Autorotate-返回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 <3.0),
<plugins>
    <plugin name="ScreenOrientation" value="ScreenOrientation" />
</plugins>

在Cordova项目>插件上,右键单击并选择新文件,然后从iOS中选择Cocoa touch,然后选择Objective-C类,然后单击下一步,在类名称中插入“ScreenOrientation”,在“CDVPlugin”的子类中单击下一步,然后单击创建。

在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项目中,单击“搜索”,然后搜索“shouldAutoRotate并找到以下内容并更改返回值”,默认情况下将为“YES”,将其更改为“NO”。

CDVViewController.m
- (BOOL)shouldAutorotate
{
    return NO;
}

在项目设置中,在“设备方向”中检查所有选项(尽管不重要),
Project Settings > Device orientation > Tick all 4 options.

然后像这样从您的项目中调用它
callScreenOrientation('LandscapeLeft');
callScreenOrientation('LandscapeRight');
callScreenOrientation('Portrait');
callScreenOrientation('PortraitUpsideDown');

关于ios - Phonegap横向未检测到90和-90的方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19929528/

相关文章:

ios - 应用内购买产品未显示在产品请求中?

ios - 动画完成时隐藏 UIProgressView

angular - ionic 3 中的 HTTP 问题

ios - 横向应用程序中的 GameCenter 身份验证抛出 UIApplicationInvalidInterfaceOrientation

ios - Swift 格式化速度

ios - 是否可以将托管网络应用程序放入 Apple App Store (2016)?

ios - 尝试为 iOS 构建应用程序时出现 Cordova 错误 65

iphone - 修复横向 iPad 应用程序中的键盘方向(颠倒键盘)

android - 相机记录有时倒置

ios - 将字符串与数组一起传递,但使用 Alamofire 在 swift 中将字符串读取为 null