如何在UIWebview中禁用放大镜?

时间:2011-08-23 06:54:37

标签: iphone uiwebview magnification

如何禁用在UIWebView上触摸时出现的放大镜?我不想禁用用户交互,但我不希望webview显示缩放玻璃。任何想法?

5 个答案:

答案 0 :(得分:8)

不,放大镜与选择有着千丝万缕的联系。要禁用它,您必须完全禁用选择(您可以使用-webkit-user-select: none来执行此操作)。

答案 1 :(得分:7)

因为接受的解决方案对我不起作用,我不得不寻找其他选择,我找到了一个 请注意,我不知道Apple是否批准这种技术。使用它是出于自己的恐惧和风险。

(我们没有被拒绝;我认为Apple并不关心你弄乱UIWebView内部问题,但要加以警告。)

我所做的是递归地向下走UIWebView个子视图并枚举他们的gestureRecognizers。每当遇到UILongPressGestureRecognizer时,我都会将enabled设置为NO

这完全摆脱了放大镜,显然禁用了任何默认的长按功能。

似乎iOS会在用户开始编辑文本时重新启用(或重新创建)这些手势识别器 好吧,我不介意在文本字段中使用放大镜,所以我不会立即禁用它们。

相反,我在文本元素上等待blur事件,当它发生时,我再次遍历子视图树。
就这么简单,它可以工作。

答案 2 :(得分:3)

因为我不知道如何使用-webkit-user-select: none我寻找其他方法。我偶然发现了Customize the contextual menu of UIWebView,然后我将其与-webkit-user-select: none结合起来。

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
   [webView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitUserSelect='none';"];
}

答案 3 :(得分:2)

我发现仅-webkit-user-select: none;并不能解决问题。相反,我找到了一个完全没有文档的属性-webkit-touch-callout

我通常使用Phonegap应用做的是:

body, body * {
    -webkit-user-select: none !important;
    user-select: none !important;
    -webkit-user-callout: none !important;
    -webkit-touch-callout: none !important;
}
input, textarea {
    -webkit-user-select: text !important;
    user-select: text !important;
    -webkit-user-callout: default !important;
    -webkit-touch-callout: default !important;
}

有人提到-webkit-user-callout-webkit-touch-callback的遗留版本,我已将其放在以防万一。

答案 4 :(得分:0)

对于我们的Cordova&我做的Swift项目:

override init!(webView theWebView: UIWebView!)
    {            
        super.init(webView: theWebView)

        removeLoupe()
    }

    /**
        Removes the magnifying glass by adding a long press gesture that overrides the inherent one that spawns
        a the loupe by default.
    */
    private func removeLoupe()
    {
        let views = webView?.subviews
        if (views == nil || views?.count == 0)
        {
            return
        }

        let longPress = UILongPressGestureRecognizer(target: self, action: "handleLongPress:")
        longPress.minimumPressDuration = 0.045
        longPress.allowableMovement = 100.0

        for view in views!
        {
            if (view.isKindOfClass(UIScrollView))
            {
                let subViews = view.subviews
                let browser = subViews[0]
                browser.addGestureRecognizer(longPress)
                break;
            }
        }
    }

    /**
       Hack to override loupe appearence in webviews.
    */
    func handleLongPress(sender:UILongPressGestureRecognizer)
    {

    }

请注意,这是我的CDVPlugin课程(或者更确切地说是我的自定义版本)。

确保您的config.xml文件包含:

<feature name="CustomCDVPlugin">
    <param name="ios-package" value="CustomCDVPlugin" />
    <param name="onload" value="true" />
</feature>

这将确保调用init()方法。