使用UIWebView进行手势识别

时间:2011-06-16 19:32:41

标签: ios cocoa-touch uiwebview uigesturerecognizer

我在我正在构建的应用中设置了一些手势识别功能。其中一个手势是单指单击,它隐藏了屏幕顶部的工具栏。除了一件事之外,效果很好:点击链接会导致工具栏消失。

是否可以检测到链接上没有点按的水龙头?我可以通过查看点击发生的位置来执行此操作,并且只有在html链接上没有发生时才采取操作吗?这是可能的,指向如何确定链接是否被点击的指针将是有帮助的。

Per Octys建议,我确实尝试将UIWebView包装在UIView中。我正在使用界面构建器,因此我在层次结构中插入了一个视图,并使UIWebView成为新UIView的“子”。层次结构现在看起来像这样:

Hierarchy screen shot

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

我将手势识别器设置更改为:

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

此代码位于viewDidLoad。

和以前一样,代码正确地看到单指单击,但点击UIWebView中的链接也会导致工具栏消失。如果没有点击链接,我只希望工具栏消失。

有人有任何建议吗?

谢谢。

克里斯

由于 克里斯

6 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:3)

好的,所以一个“hack-ish”解决方法是让UIWebView的视图控制器成为你实例化的手势识别器的代理(UIGestureRecognizerDelegate)我通常不喜欢这样的解决方案,但是..

将手势识别器分配给包装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中,应该有一个应用实时路由器(当用户实际点击一个链接时被调用)

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

答案 2 :(得分:1)

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

如果navigationTypeUIWebViewNavigationTypeLinkClicked,您可以通过查看[request URL]获取点击的网址。

答案 3 :(得分:1)

我一直在寻找相同的东西,并发现:有一个iOS特定的属性,当您在链接上手指时禁用标注。您可以将其添加到网址的样式(CSS)中。

-webkit-touch-callout: none;

答案 4 :(得分:1)

这对我有用。添加以下代码行

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

答案 5 :(得分:0)

我遇到了同样的问题。这个解决方案对我有用:

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];