【问题标题】:Gesture recognition with UIWebView使用 UIWebView 进行手势识别
【发布时间】:2011-06-16 19:32:40
【问题描述】:

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

是否可以检测到不是点击链接的点击?我可以通过查看点击发生的位置来做到这一点,并且只在它没有发生在 html 链接上时才采取行动吗?这是可能的吗,如何确定链接是否被点击的指针会很有帮助。

根据 Octys 的建议,我确实尝试将 UIWebView 包装在 UIView 中。我正在使用界面生成器,因此我在层次结构中插入了一个视图,并使 UIWebView 成为新 UIView 的“子级”。现在的层次结构如下所示:

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

我将手势识别器设置更改为如下所示:

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

此代码位于 viewDidLoad 中。

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

大家有什么建议吗?

谢谢。

克里斯

谢谢 克里斯

【问题讨论】:

  • 编辑添加有关如何实施的问题。
  • 在尝试@octy 的建议后添加了更多信息

标签: ios cocoa-touch uiwebview uigesturerecognizer


【解决方案1】:

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

【讨论】:

  • 我对此寄予厚望,但行为仍然相同。如果我注释掉 shouldRecognizeSimultaneouslyWithGestureRecognizer: 水龙头不会传递到包含视图。谢谢。
  • 您是否尝试在您的 UIWebView 上设置exclusiveTouch = YES?不确定这会起作用,但我现在想不出其他任何有意义的事情......对不起!手势识别器的问题是它们不参与事件传递链。所以如果这不起作用,我们必须想出更复杂的解决方案。
  • 是的。 Exclusivetouch也不起作用。我想知道 UIWebView 是否掌握所有单点触摸单指点击,因为在事件发生时它不知道用户是否触摸了任何有意义的东西。
  • @octy - 我和你有同样的问题,但是,这个问题的答案并不能解决问题(如你所说)。你知道如何解决这个问题吗?
  • @5StringRyan:很可能你没有正确设置代理。
【解决方案2】:

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

将手势识别器分配给包裹您的 Web 视图的视图,并将其委托设置为 self。

然后在委托方法gestureRecognizer:shouldRecieveTouch方法中,设置状态指示有点击事件,

从委托方法返回 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
}

【讨论】:

    【解决方案3】:

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

    如果navigationType是UIWebViewNavigationTypeLinkClicked,则可以通过检查[request URL]获取点击的URL。

    【讨论】:

    • 是的,我正在这样做。也许我没有以正确的方式问这个问题。我想要的是:我想检测 uiwebview 上的点击,而不是链接上的点击。我想使用这些点击来隐藏工具栏。如果用户点击链接,我不想隐藏工具栏。 -- 谢谢
    【解决方案4】:

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

    -webkit-touch-callout: none;
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 2014-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-06
          • 1970-01-01
          • 1970-01-01
          • 2010-09-16
          相关资源
          最近更新 更多