如何禁用 UIWebview 中的放大镜?

Posted

技术标签:

【中文标题】如何禁用 UIWebview 中的放大镜?【英文标题】:How to disable the magnifying glass in UIWebview? 【发布时间】:2011-08-23 06:54:37 【问题描述】:

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

【问题讨论】:

你还想修改 webview 吗? 【参考方案1】:

不,放大镜与选择密不可分。要禁用它,您必须完全禁用选择(您可以使用-webkit-user-select: none 来执行此操作)。

【讨论】:

如果输入/文本区域在没有用户触摸键盘上的“完成”的情况下获得焦点和模糊,则此技巧将不再有效。 (ios 7)【参考方案2】:

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

(我们的没有被拒绝;我认为 Apple 不会那么在意你搞乱UIWebView 内部结构,但请注意。)

我所做的是递归地遍历UIWebView 子视图并枚举它们的gestureRecognizers。每当我遇到UILongPressGestureRecognizer 时,我都会将其enabled 设置为NO

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

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

相反,我在我的文本元素上等待blur 事件,当它发生时,我再次遍历子视图树。 就这么简单,而且有效。

【讨论】:

投反对票到底是怎么回事?记录成功为我们工作的解决方案有什么问题吗? 这听起来很合法。 有人为此创建了一个cordova插件:github.com/EddyVerbruggen/cordova-plugin-ios-longpress-fix/blob/… 对于电容器,请看:github.com/ionic-team/capacitor/discussions/3208 和 github.com/Nikita-schetko/capacitor-suppress-longpress-gesture【参考方案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';"];

【讨论】:

-webkit-user-select: none 是一个 CSS 属性。因此,您需要使用您发布的代码,或者如果您有权访问 web 视图中显示的网络内容,则将其包含在 CSS 中。【参考方案4】:

我发现单独使用-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 都进行了尝试 @Mo.Ashfaq 您使用哪个 iOS 版本进行测试? ios8,在 iphone 5s 中。附加信息是我的 div 中有一些元素,如 h2、img,我将此解决方案应用于每个元素。【参考方案5】:

对于我们的 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() 方法。

【讨论】:

以上是关于如何禁用 UIWebview 中的放大镜?的主要内容,如果未能解决你的问题,请参考以下文章

在我做其他事情时禁用放大滚动视图

如何设置 UIWebView 以使页面自动放大并适合整个窗口?

即使禁用了文本选择,IOs Cordova 长按也会显示文本选择放大镜,如何删除?

当页面加载时,如何使 UIWebView 看起来与移动 safari 完全一样? (不是超级放大)

禁用 UITextView 的放大镜但启用目标 c 中的链接和电话号码检测

在流星科尔多瓦应用程序中的 iOS 9 上全局禁用放大镜