從我所看到的情況來看,UIWebView並不能很好地與其他人玩。對於手勢識別器,你可以嘗試從返回YES:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
我不得不向後兼容3.0,所以我結束了做所有的動作與UIWebView的Javascript中處理。這不是一個好的解決方案,但它可以滿足我的需求。我能夠捕捉元素上的長按,以及輕拍,輕掃,捏和旋轉。當然,我只使用本地內容。
編輯:
你可以看看在PhoneGap發送消息到一個UIWebView的委託的一個例子。簡而言之,您使用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的代碼中看到。根據您的使用情況,您可能需要做同樣的事情。關於這個話題還有其他的問題。
這裏是Event Handling文檔。在我來說,我添加的事件監聽器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);
};
實際的事件處理在很大程度上取決於你的需求。每個事件處理程序將收到一個TouchEvent與觸摸屬性,其中每個項目是Touch。你可以在你的touchstart處理程序中記錄開始時間和位置。如果觸摸移動得太遠或錯過了一段時間,則觸摸不夠長。
WebKit可能會嘗試處理長按以開始選擇和複製。在您的事件處理程序中,您可以使用event.preventDefault();
來停止默認行爲。我還發現一些東西方便的cs屬性-webkit-user-select:none
。
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項目。你可以在別處找到更好的例子。
正如你所看到的,這不是你的問題的快速答案。我對我得到的結果很滿意。我正在使用的html沒有超過一個或兩個鏈接的交互式元素。
謝謝,我對Javascript一無所知;你會如此友善,指出我在正確的方向如何檢測通過Javascript的UIWebView的龍頭,並調用Objective-C方法?我不介意與非iPad定位的3.0兼容。 對於任何其他只關心3.2+的人,我通過在UIWebView頂部創建一個透明視圖並檢測其中的水龍頭來解決我的問題。 – rscott 2010-05-26 03:24:35
感謝DAT工作 – user578386 2013-08-24 09:02:08
謝謝你,它工作得很好 – 2017-01-23 01:09:37