私が見たところ、UIWebViewは他の人とうまく機能しません。ジェスチャレコグナイザーの場合、以下からYESを返すことを試みることができます。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
3.0との下位互換性が必要だったため、UIWebView内でJavascriptを使用してすべてのジェスチャ処理を行うことになりました。良い解決策ではありませんが、それは私のニーズには合いました。要素を長押ししたり、タップ、スワイプ、ピンチ、回転したりすることができました。もちろん、私はローカルコンテンツのみを使用していました。
編集:
UIWebViewのデリゲートにメッセージを送信する例については、 PhoneGapを参照してください。簡単に言うdocument.location = "myscheme:mycommand?myarguments"
と、このデリゲートコールバックからコマンドと引数を使用して解析します。
-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
if ( [[[inRequest URL] absoluteString] hasPrefix:@"myscheme:"] ) {
//.. parse arguments
return NO;
}
}
PhoneGapコードで、メッセージを送信するためのキューとタイマーが設定されていることがわかります。使用法によっては、同じことをする必要があるかもしれません。このトピックに関するSOに関する他の質問があります。
これがイベント処理のドキュメントです。私の場合、document
からにイベントリスナーを追加しました<body onload="myloader();">
function myloader() {
document.addEventListener( 'touchcancel' , touch_cancel , false );
document.addEventListener( 'touchstart' , touch_start , false );
document.addEventListener( 'touchmove' , touch_move , false );
document.addEventListener( 'touchend' , touch_end , false );
};
実際のイベント処理は、ニーズによって大きく異なります。各イベントハンドラーは、各アイテムがTouchであるtouchesプロパティを持つTouchEventを受け取ります。タッチスタートハンドラーで開始時間と場所を記録できます。タッチが遠くに移動したり、間違った時間が経過したりした場合、それは長いタッチではありません。
WebKitは、選択とコピーを開始するために長いタッチを処理しようとする場合があります。event.preventDefault();
イベントハンドラーでは、デフォルトの動作を停止するために使用できます。また、-webkit-user-select:none
cssプロパティがいくつかの点で便利であることがわかりました。
var touch = {};
function touch_start( event /*TouchEvent*/ {
event.preventDefault();
touch = {};
touch.startX = event.touches.item(0).pageX;
touch.startY = event.touches.item(0).pageY;
touch.startT = ( new Date() ).getTime();
}
これは私がjavascriptを使用した2番目のプロジェクトです。他の場所でより良い例を見つけることができます。
ご覧のとおり、これは問題に対する迅速な答えではありません。得られた結果にはかなり満足しています。私が使用していたhtmlには、1つまたは2つのリンク以外のインタラクティブな要素はありませんでした。