【问题标题】:UIWebview remove tap to focusUIWebview 移除点击聚焦
【发布时间】:2011-12-29 15:04:34
【问题描述】:

当我双击网站的一部分时,UIWebView 通常专注于选定的内容,现在我希望 UIWebView 忽略双击但仍然能够与之交互。

我该怎么办?

【问题讨论】:

    标签: objective-c ios uiwebview uiscrollview


    【解决方案1】:

    我认为这样做的方法是在你的 UIWebView 顶部添加一个 UITapGestureRecognizer,然后你可以根据需要过滤双击。

    您可以在此处找到示例代码/讨论:

    Add a UITapGestureRecognizer to a UIWebView

    【讨论】:

    • 如果我添加一个 UITapGestureRecognizer 它不幸地触发了这两个事件。它不会取代它。
    • 嗯,抱歉,我一定是对 Android 感到困惑。你有没有想过在 UIWebView 之上放置一个透明视图并用它来过滤掉双击?
    【解决方案2】:

    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 之前的第二个答案

    【讨论】:

    • UIWebView 没有收到 touchesBegan,有什么解释吗?
    • 啊,是的,我现在明白了。看起来触摸事件由 web 视图包含的滚动视图处理。更新了答案以匹配这个。
    • iOS5 之前没有“scrollView”选择器,因此这不适用于例如4.3
    • 是的,这可能是真的。这仅适用于 iOS 5.0 及更高版本。
    • 跟随艾伦摩尔的第二个回应。在 webview 上添加一个透明视图,通过点击测试捕获触摸事件,如果不是双击则转发事件。这可能很棘手并且很快变得复杂。我想,既然你没有接受那个回应,那你一开始就不想要它。
    【解决方案3】:

    双击被 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

    希望对你有帮助。

    【讨论】:

    • 有趣的是,Apple 将其实现为 UIGestureRecognizer 没有更低的级别。
    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多