如何在UIWebview中禁用放大镜?

13

如何禁用 UIWebView 上长按时出现的放大镜?我不想禁用用户交互,但也不想在网页视图中显示缩放镜。有什么建议吗?


你还需要在webview上进行触摸吗? - Satyam
5个回答

7
不,放大镜与选择紧密相连。要禁用它,您将不得不完全禁用选择(您可以使用 -webkit-user-select: none 来实现)。

1
如果输入框/文本区域在用户没有触碰键盘上的“完成”按钮的情况下获得焦点并失去焦点,则此技巧将不再起作用。(iOS 7) - vilicvane

6
因为被接受的解决方案对我无效,所以我不得不寻找其他选项,并找到了一个。
请注意,我不知道苹果是否批准此技术。使用它要自担风险。
(我们的应用没有被拒绝;我认为苹果并不太在意你操作UIWebView内部,但请注意。)
我的做法是递归遍历UIWebView子视图并枚举它们的gestureRecognizers。每当我遇到一个UILongPressGestureRecognizer时,我将其enabled设置为NO
这样可以完全摆脱放大镜,并显然禁用任何默认的长按功能。
似乎iOS在用户开始编辑文本时重新启用(或重新创建)这些手势识别器。
嗯,我不介意在文本字段中使用放大镜,所以我不会立即禁用它们。
相反,我等待我的文本元素上的blur事件,并在其发生时再次遍历子视图树。
就是这么简单,而且它有效。

这个下投票是怎么回事?我们记录成功解决方案有什么问题吗? - Dan Abramov
这对我来说听起来很合理。 - Mark
有人为此创建了一个 Cordova 插件:https://github.com/EddyVerbruggen/cordova-plugin-ios-longpress-fix/blob/master/src/ios/LongPressFix.m - Aggressor
对于 Capacitor,请查看:https://github.com/ionic-team/capacitor/discussions/3208和https://github.com/Nikita-schetko/capacitor-suppress-longpress-gesture - Vojto

3

因为我不知道如何使用-webkit-user-select: none,所以我寻找其他方法。然后我偶然发现了这个自定义UIWebView的上下文菜单,随后将其与-webkit-user-select: none结合使用。

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

1
"-webkit-user-select: none" 是一个CSS属性。因此,您需要使用您发布的代码,或者如果您可以访问在您的Web视图中显示的Web内容,则应将其包含在您的CSS中。 - Ben

3
我发现仅使用-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的旧版本,我仅仅是为了保险起见加上了这个。


在PhoneGap应用程序中无法工作。我已经尝试了每个div,但仍然无法解决问题。 - Mohammad Ashfaq
@Mo.Ashfaq,您使用哪个iOS版本进行测试? - Rob Fox
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Mohammad Ashfaq

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()方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接