据我所见,UIWebView 与其他人玩得并不好。对于手势识别器,您可以尝试从以下位置返回 YES:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
我必须向后兼容 3.0,所以我最终在 UIWebView 中使用 Javascript 进行所有手势处理。不是一个好的解决方案,但它满足我的需求。我能够捕捉一个元素上的长按,以及点击、滑动、捏合和旋转。当然,我只使用本地内容。
编辑:
您可以在PhoneGap中查看向 UIWebView 的委托发送消息的示例。简而言之,您使用document.location = "myscheme:mycommand?myarguments"
then 解析此委托回调中的命令和参数:
-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
if ( [[[inRequest URL] absoluteString] hasPrefix:@"myscheme:"] ) {
//.. parse arguments
return NO;
}
}
您可以在 PhoneGap 代码中看到他们设置了一个队列和计时器来发送消息。根据您的使用情况,您可能需要执行相同的操作。关于这个主题还有其他关于 SO 的问题。
这是事件处理文档。就我而言,我将事件侦听器添加到document
from<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 );
};
实际的事件处理很大程度上取决于您的需求。每个事件处理程序都将接收一个带有 touches 属性的TouchEvent,其中每个项目都是一个Touch。您可以在 touchstart 处理程序中记录开始时间和位置。如果触摸移动到很远或经过错误的时间,则不是长触摸。
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 的第二个项目。你可以在别处找到更好的例子。
如您所见,这不能快速解决您的问题。我对我得到的结果很满意。我正在使用的 html 除了一两个链接之外没有任何交互元素。