据我所见,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 代码中看到他们设置了一个队列和计时器来发送消息。根据您的使用情况,您可能需要执行相同的操作。关于这个主题还有其他关于 SO 的问题。
这是Event Handling 文档。就我而言,我从<body onload="myloader();"> 向document 添加了事件侦听器
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 除了一两个链接之外没有任何交互元素。