3

我在让我的 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,而是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 在启动时使用调试,在归档时使用发布。我试图将存档模式设置为使用调试但同样的问题。我试图将运行设置为释放,但它仍然工作正常。

有任何想法吗 ???

4

2 回答 2

0

在 Xcode 5 中,选择您的目标,单击 Info 选项卡并确保您选择了适当的“Supported Interface Orientations”。在我的例子中,Phonegap CLI 生成了一个项目,它只将 Portrait 添加到了方向列表中——即使我在 config.xml 中指定了 Landscape

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

于 2013-12-13T19:06:42.327 回答
0

使用原生代码作为插件广告使用 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');
于 2014-05-13T06:41:47.233 回答