29

iPhone アプリケーションのローカル リソースから HTML Javascript および CSS コンテンツを提供しようとしていますが、onOrientationChange イベントの処理と外部 Javascript の組み込みに問題があります。

CSS で適切にリンクできるようですが、javascript ではできません。onOrientationChange ( iPhone Web サイトの構築方法) を処理する次の例を使用しようとしていますが、アプリの NSBundle mainBundle から Web ページを提供しています。

body.onorientationchange と window.onorientationchange に javascript 関数をアタッチしようとしましたが、UIWebView からローカル (またはリモート) で提供された場合はどちらも機能しませんが、iPhone Safari を使用している場合は機能します。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <title>How to build an iPhone website</title>

    <meta name="author" content="will" />
    <meta name="copyright" content="copyright 2008 www.engageinteractive.co.uk" />
    <meta name="description" content="Welcome to engege interactive on the iPhone!" />
    <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;">
    <link rel="apple-touch-icon" href="images/template/engage.png"/>

    <style type="text/css">
        @import url("iphone.css");
    </style>
    <!--
    <script type="text/javascript" src="orientation.js"></script>
    -->
    <script type="text/javascript">


function updateOrientation(){
    try  {
        var contentType = "show_normal";
        switch(window.orientation){
            case 0:
                contentType = "show_normal";
                break;

            case -90:
                contentType = "show_right";
                break;

            case 90:
                contentType = "show_left";
                break;

            case 180:
                contentType = "show_flipped";
                break;
        }

        document.getElementById("page_wrapper").setAttribute("class", contentType);
        //alert('ORIENTATION: ' + contentType);
    }
    catch(e) {
        alert('ERROR:' + e.message);
    }
} 

window.onload = function initialLoad(){
    try {
        loaded();
        updateOrientation();
    }
    catch(e) {
        alert('ERROR:' + e.message);
    }
}

        function loaded() {
            document.getElementById("page_wrapper").style.visibility = "visible";

        }


    </script>

</head>

<body onorientationchange="updateOrientation();">

    <div id="page_wrapper">
        <h1>Engage Interactive</h1>
        <div id="content_left">
            <p>You are now holding your phone to the left</p>
        </div>
        <div id="content_right">
            <p>You are now holding your phone to the right</p>
        </div>
        <div id="content_normal">
            <p>You are now holding your phone upright</p>
        </div>
        <div id="content_flipped">
            <p>This doesn't work yet, but there is a chance apple will enable it at some point, so I've put it in anyway. You would be holding your phone upside down if it did work.</p>
        </div>
    </div>

</body>
</html>
4

5 に答える 5

47

答えは、XCode で表示された警告からたどることができます。

警告: アーキテクチャ i386 の sourcecode.javascript タイプのファイル '$(PROJECT_DIR)/html/orientation.js' を処理するルールがありません

XCode setup *.js javascript を、リソースとして含めたいときにアプリケーションでコンパイルする必要があるソース コードのタイプとして、2 つのことを実行して解決しました。

  1. .js ファイルを選択し、[詳細] ビューで、コンパイル済みコードであることを示すブルズアイ列の選択を解除します。
  2. [グループとファイル] ビューで [ターゲット] ツリーを展開し、アプリケーションを展開してから、[バンドル リソースのコピー] に移動し、*.js ファイルをその中にドラッグします。

Apple dev フォーラムには、投稿された解決策があります。

「Xcodeは.jsがコンパイルされるものだと考えています」機能に少し慣れているようです。基本的に、Xcode は、スクリプトを何らかの方法で実行またはコンパイルする必要があると考えているため、ソース コードの一部としてマークします。もちろん、ソース コードはリソースにコピーされません。

そのため、2 つのことを行う必要があります。プロジェクトで .js ファイルを選択し、それがコンパイル済みであることを示すチェックボックス (「ブルズアイ」列) をオフにします。これを行わないと、ビルド ログにファイルをコンパイルできないという警告が表示されます (これが最初の警告になります。ビルドに表示されるすべての警告を常に把握し、修正するようにしてください)。 )。

次に、それをターゲットの「バンドル リソースのコピー」にドラッグ アンド ドロップします。

于 2009-05-12T05:59:54.513 に答える
24

onorientationchange ハンドラーが UIWebView で呼び出されないという 2 番目の問題に対する答え:

window.orientation プロパティが正しく機能せず、window.onorientationchange ハンドラが呼び出されないことに気付きました。ほとんどのアプリでこの問題が発生します。これは、window.orientation プロパティを設定し、UIWebView を含むビュー コントローラーの willRotateToInterfaceOrientation メソッドで window.onorientationchange を呼び出すことで修正できます。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    switch (toInterfaceOrientation)
    {
        case UIDeviceOrientationPortrait:
            [webView stringByEvaluatingJavaScriptFromString:@"window.__defineGetter__('orientation',function(){return 0;});window.onorientationchange();"];
            break;
        case UIDeviceOrientationLandscapeLeft:
            [webView stringByEvaluatingJavaScriptFromString:@"window.__defineGetter__('orientation',function(){return 90;});window.onorientationchange();"];
            break;
        case UIDeviceOrientationLandscapeRight:
            [webView stringByEvaluatingJavaScriptFromString:@"window.__defineGetter__('orientation',function(){return -90;});window.onorientationchange();"];
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            [webView stringByEvaluatingJavaScriptFromString:@"window.__defineGetter__('orientation',function(){return 180;});window.onorientationchange();"];
            break;
        default:
            break;
    }
}
于 2010-02-03T08:54:47.723 に答える
6

使用する方が良いです

  • (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

サファリは実際にはビューが回転した後にorientationChangeを呼び出しているためです。

ページが回転した後でHTML5キャンバスのサイズを変更する必要があり、コンテナの大きさがわかっていたため、これは私にとって重要でした。

于 2010-04-30T18:01:56.960 に答える
3

ローカル リソースで UIWebView を使用するための追加情報を見つけました。

短いブログにまとめました。誰かが興味を持っている場合は、ダウンロードできる実用的な例があります。

http://mentormate.com/blog/iphone-uiwebview-class-local-css-javascript-resources/

于 2010-03-16T12:51:24.070 に答える
2

iOS 4.2 は UIWebView で window.orientation プロパティをサポートしていないことがわかりましたが、モバイル サファリでは機能します...したがって、JS を向きの変更に反応させるために見つけた唯一の方法は、objective-c を作成することでした。コードは、現在表示されている UIWebView Web ページで定義されている JavaScript 関数を呼び出します。ViewController の didRotateFromInterfaceOrientation メソッドをオーバーライドするサンプル コードを次に示します。

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    [webView stringByEvaluatingJavaScriptFromString:
          [NSString stringWithFormat:@"didRotateTo('%@')", 
            [self currentOrientationAsString]]];
}
- (NSString*) currentOrientationAsString {
    switch([[UIDevice currentDevice] orientation]) {
        case UIDeviceOrientationLandscapeLeft:
        case UIDeviceOrientationLandscapeRight:
            return @"landscape";
    }
    return @"portrait"; // assuming portrait is default
}

次のように Javascript 関数を定義する必要があります。

function didRotateTo(ori) {
  if (ori=="portrait") {
    // ... do something
  } else {
    // ... do something else
  }
}

楽しみ!:)

于 2011-04-01T16:31:14.240 に答える