iphone - UIGestureRecognizer 是否适用于 UIWebView?

标签 iphone objective-c cocoa ipad uigesturerecognizer

我试图让 UIGestureRecognizer 与 UIWebview 一起工作,它是 UIScrollView 的 subview 。这听起来很奇怪,但是当我将 numberOfTouchesRequired 设置为 2 时,选择器会触发,但是当 numberOfTouchesRequired 设置为 1 时,选择器不会触发。

这是我的代码:

UITapGestureRecognizer *tap1 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(select1:)];
    tap1.numberOfTouchesRequired = 2;
    tap1.numberOfTapsRequired = 1;
    tap1.delegate = self;
    [self.ans1WebView addGestureRecognizer:tap1];
    [tap1 release];

- (void) select1:(UILongPressGestureRecognizer *)sender {
    //Do Stuff
}

我已经通过使用 Apple 的 UIGestureRecognizer 示例并在他们的 nib 中插入 webview 来确认这一点。他们的点击代码在任何地方都有效,但在 web View 区域内。

最佳答案

据我所见,UIWebView 不能很好地与其他人配合使用。对于手势识别器,您可以尝试从以下位置返回 YES:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

我必须向后兼容 3.0,所以我最终在 UIWebView 中使用 Javascript 进行所有手势处理。不是一个好的解决方案,但它满足我的需求。我能够捕捉一个元素上的长按,以及点击、滑动、捏合和旋转。当然,我只使用本地内容。

编辑:

您可以查看PhoneGap有关向 UIWebView 的委托(delegate)发送消息的示例。简而言之,您使用 document.location = "myscheme:mycommand?myarguments"然后从这个委托(delegate)回调中解析出命令和参数:

-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
  if ( [[[inRequest URL] absoluteString] hasPrefix:@"myscheme:"] ) {
    //.. parse arguments
    return NO;
  }
}

您可以在 PhoneGap 代码中看到他们设置了一个队列和计时器来发送消息。根据您的使用情况,您可能需要执行相同的操作。关于这个主题还有其他关于 SO 的问题。

这里是 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带有 touches 属性,其中每个项目都是 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 除了一两个链接之外没有任何交互元素。

关于iphone - UIGestureRecognizer 是否适用于 UIWebView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2909807/

相关文章:

iPhone 设置 : create dependent settings?

ios - 是否可以在两个场景上有一个固定的 SKSpriteNode?

ios - 使用 GPUImage 与 Core Image 与 UIImage 解压缩?

swift - 实现可散列和重载运算符的协议(protocol)

ios - 如何在 hh :mm:ss format? 中输入时间值

ios - 更改 FPopover Controller 的颜色

iphone - 如何保护 iPhone 应用程序中存储的外部 Web 服务密码?

iphone - 漂亮的 UIButton

objective-c - Xcode 4、iOS SDK 4.3 和带有 Greystripe 广告解决方案的 undefined symbol

objective-c - 与 NSMutableArray 一起发布?