【发布时间】:2011-12-29 15:04:34
【问题描述】:
当我双击网站的一部分时,UIWebView 通常专注于选定的内容,现在我希望 UIWebView 忽略双击但仍然能够与之交互。
我该怎么办?
【问题讨论】:
标签: objective-c ios uiwebview uiscrollview
当我双击网站的一部分时,UIWebView 通常专注于选定的内容,现在我希望 UIWebView 忽略双击但仍然能够与之交互。
我该怎么办?
【问题讨论】:
标签: objective-c ios uiwebview uiscrollview
我认为这样做的方法是在你的 UIWebView 顶部添加一个 UITapGestureRecognizer,然后你可以根据需要过滤双击。
您可以在此处找到示例代码/讨论:
【讨论】:
iOS 5.0+:
UIWebView 包含一个UIScrollView 以显示其内容,并且可以通过UIWebView 的scrollView 属性访问。因此,一种可能的方法是继承UIScrollView 并覆盖-touchesShouldBegin:withEvent:inContentView。您可以从UITouch 对象的tapCount 属性中获取点击次数,该属性可用于过滤掉双击手势,否则调用super 方法。这看起来像:
-(BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view {
UITouch * touch = [touches anyObject]; //Get a touch object
if (2 == touch.tapCount) { //If this is a double-tap...
return NO; //...don't begin touches
}
else { //Otherwise, call the superclass' implementation
return YES;
}
}
但是,为了将 web 视图的滚动视图设置为您的自定义子类,您可能还必须将 UIWebView 子类化(这通常是不受欢迎的)。话虽如此,它可能会继承UIWebView 并重新定义scrollView 属性。在接口文件中:
@interface MyAwesomeWebView : UIWebView {
}
@property (nonatomic, readonly, retain) MyAwesomeScrollView * scrollView;
@end
并且在实现文件中:
@implementation
@dynamic scrollView
@end
不过,请谨慎行事。
iOS 5.0 之前的版本:
正如 Alan Moore 在 cmets 中所写,您可以在 Web 视图之上添加一个透明视图,通过命中测试捕获所有触摸事件,并将触摸事件转发到 Web 视图,除非有双击。
编辑:更新的答案包括关于子类化 UIWebView 等的警告。 编辑 2:包含 iOS 5.0 之前的第二个答案
【讨论】:
双击被 UITapGestureRecognizer 识别。 如果你真的想要这个,请通过视图层次结构。 有点棘手,但应该可以。
代码如下所示:
- (void)goThroughSubViewFrom:(UIView *)view {
for (UIView *v in [view subviews])
{
if (v != view)
{
[self goThroughSubViewFrom:v];
}
}
for (UIGestureRecognizer *reco in [view gestureRecognizers])
{
if ([reco isKindOfClass:[UITapGestureRecognizer class]])
{
if ([(UITapGestureRecognizer *)reco numberOfTapsRequired] == 2)
{
[view removeGestureRecognizer:reco];
}
}
}
}
我在这里放了一个演示:NoDoubleTapWebView
希望对你有帮助。
【讨论】: