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;
    }
}

e.orientation の代わりに window.orientation を使用することもできます。これは、このようなものを処理する一般的な方法です。

何らかの理由で、アラート「方向イベント発火」は、電話が 180 度になってから 0 に戻ったときにのみ呼び出されます。90 度または -90 度ではイベントは発生していません。

サポートされているインターフェイスの向きを xcode で 4 つの可能性すべてに設定しました。そして、私の index.html には次のものがあります。

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

アプリを横向きモードで起動することはできますが、アプリの実行中に変更することはできません。ポートレートモードに問題なく戻すことができます。

何らかの理由で、電話が 90 度と -90 度のときに教えてくれません。

ローテーションを処理しているのは phonegap ではなく、phonegap で使用されるブラウザーであると読みました。これは、電話が傾いたときにブラウザーにすべてのサイズを変更して回転させたいので、私が探している動作です。

また、バージョン 2.3.0 以降のローテーションの処理に関する多くの投稿を読んだので、phonegap を更新することに消極的です。

何か案は ??

編集:

フォーラムで質問しただけで、答えが返ってくることがあります。

私の場合の問題は、私の会社の別の開発者が追加したことでした:

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

私のindex.jsファイルに。

どうやら shouldRotateToOrientation 関数は phonegap がコード内で探すものであり、そこにある場合は画面の回転を制限します。

以下を書いてみました。

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

そして、すべてが正常に機能しました....または、1つのことが残っています

次の問題は、現在の方向を見つけることです。どうやら shouldRotateToOrientation に渡される値は現在の向きを示します。(私の場合は interfaceOrientation) 1 は縦向きを意味し、2,3,4 は他の向きを指します。0、90、-90、180 を返すと書いている人もいます (私の場合、最後に見つかったものは true でした)。ただし、各方向シフトで関数を 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 からデバイスまたは任意のシミュレーターを直接起動すると、グラフィックはランドスケープ モードでスケーリングされます。

問題は、コードを起動するのではなく、異なるセットアップを使用して .ipa ファイルを生成する xcode であるという投稿を見つけました。これは、xcode が起動時にデバッグを使用し、アーカイブ時にリリースするためです。デバッグを使用するようにアーカイブ モードを設定しようとしましたが、同じ問題が発生しました。run を release に設定しようとしましたが、それでも問題なく動作しました。

何か案は ???

4

2 に答える 2

0

ネイティブ コードをプラグイン広告として使用し、javascript を使用して呼び出します。config.xml にも追加します。CDViewController で Autorotate を変更 - NO を返します。詳細な解決策が必要な場合は、お知らせください。私はこの同じ条件を解決しました。

更新:私の解決策

ScreenOrientation.js として新しい 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>

Plugins の下に追加します (Cordova < 3.0 の場合)、

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

Cordova プロジェクト > プラグインで右クリックして新しいファイルを選択し、iOS から Cocoa touch を選択し、objective-C クラスを選択して [次へ] をクリックします。

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 に答える