用UIWebView进行手势识别

我在我正在构build的应用程序中设置了一些手势识别。 其中一个手势是单指单击,将工具栏隐藏在屏幕的顶部。 除了一件事情以外,还有很好的效果:点击链接也会导致工具栏消失。

是否有可能检测到不是一个链接上的水龙头? 我可以通过查看轻敲发生的位置来做到这一点,只有在html链接中没有发生时才采取行动? 这是可能的,一个指示如何确定一个链接被挖掘是有帮助的。

每个八月的build议,我曾尝试将UIWebView包装在一个UIView。 我正在使用接口生成器,所以我在层次结构中插入了一个视图,并使UIWebView成为新UIView的“子”。 现在层次结构如下所示:

层次结构屏幕截图

我在视图控制器中为视图添加了一个IBOutlet,并在界面构build器中将其链接起来。

我改变了手势识别器设置看起来像这样:

UITapGestureRecognizer* singleTap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleSingleTap:)]; singleTap.numberOfTouchesRequired=1; singleTap.delegate=self; [self.UIWebViewContainer addGestureRecognizer:singleTap]; [singleTap release]; 

这段代码驻留在viewDidLoad中。

与以前一样,代码正确地看到一个单指单击,但是在UIWebView中的一个链接上点击也导致工具栏消失。 如果链接未被点击,我只希望工具栏消失。

任何人有任何build议?

谢谢。

克里斯

谢谢Chris

尝试将UIWebView包装在UIView容器中,并在容器视图上设置手势识别器。 触摸事件不会由UIWebView处理将被传递到视图的层次结构,并被你的容器视图拦截,假设它实现了适当的处理程序(这些处理程序应该实现用于隐藏工具栏的代码…)。

好的,所以一个“黑客”的解决方法是使视图控制器的UIWebView的房子,您实例化的手势识别器的代表(UIGestureRecognizerDelegate)我通常不是像这样的解决scheme的粉丝,但…

将手势识别器分配给包装您的Web视图的视图,并将其代理设置为self。

然后在委托方法gestureRecognizer:shouldRecieveTouch方法中,设置状态以指示出现了一个tap事件,

从委托方法返回NO,以便事件传播到响应者链到UIWebView。

 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ _userTapped = YES; [self performSelectorOnMainThread:@selector(hideMenuIfNotLink) afterDelay:??.?]; //??.?? amount of time to lapse to see if shouldStartLoadWithRequest gets called. return NO; } -(void)hideMenuIfNotLink{ if(_userTapped) //hideMenu } 

现在,在你的UIWebViewDelegate的shouldStartLoadWithRequest(当用户实际上点击链接时被调用)

 if(_userTapped){ _userTapped = NO; //possibly code to reshow or verify keep showing menu } 

您可以使用UIWebViewDelegate协议的-webView:​shouldStartLoadWithRequest:​navigationType:方法。

如果navigationTypeUIWebViewNavigationTypeLinkClicked ,则可以通过选中[request URL]来获取点击的[request URL]

我一直在寻找同样的东西,并发现这一点:有一个iOS特定的属性,当你的手指在链接上禁用标注。 您将这添加到您的url的样式(CSS)。

 -webkit-touch-callout: none; 

这工作me.try添加下面的代码行

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; } 

我遇到了同样的问题。 这个解决scheme为我工作:

1)确保将协议添加到您的界面: UIGestureRecognizerDelegate例如:

 @interface ViewController : UIViewController _SlideViewProtocol, UIGestureRecognizerDelegate_ 

2)添加这一行代码

  - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { } 

3)

 UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(nextSlide)]; swipeGesture.numberOfTouchesRequired = 1; swipeGesture.direction = (UISwipeGestureRecognizerDirectionLeft); swipeGesture.cancelsTouchesInView = YES; [swipeGesture setDelegate:self]; [self.view addGestureRecognizer:swipeGesture];