用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:
方法。
如果navigationType
为UIWebViewNavigationTypeLinkClicked
,则可以通过选中[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];