我在我正在构建的应用中设置了一些手势识别功能。其中一个手势是单指单击,它隐藏了屏幕顶部的工具栏。除了一件事之外,效果很好:点击链接会导致工具栏消失。
是否可以检测到链接上没有点按的水龙头?我可以通过查看点击发生的位置来执行此操作,并且只有在html链接上没有发生时才采取操作吗?这是可能的,指向如何确定链接是否被点击的指针将是有帮助的。
Per 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中的链接也会导致工具栏消失。如果没有点击链接,我只希望工具栏消失。
有人有任何建议吗?
谢谢。
克里斯
由于 克里斯
答案 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:
方法。
如果navigationType
为UIWebViewNavigationTypeLinkClicked
,您可以通过查看[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];