【问题标题】:How to disable Copy and Paste in UIWebView如何在 UIWebView 中禁用复制和粘贴
【发布时间】:2011-10-04 07:38:10
【问题描述】:

当用户在 UIWebView 中长按时,会弹出一个复制和粘贴弹出窗口。是否可以禁用系统弹出复制和粘贴功能,但仍允许用户单击链接并转到新页面?

【问题讨论】:

标签: iphone uiwebview uigesturerecognizer


【解决方案1】:

您可以尝试将 javascript 注入 webView。此代码也适用于 iPhone,但仅在页面完全加载时才有效。 http://javascript.internet.com/page-details/disable-text-selection.htmlhttp://solidlystated.com/scripting/proper-way-to-disable-text-selection-and-highlighting/

要使其在页面仅加载一半或仍在加载时正常工作,您可能必须使用与此类似的设置,在该设置中注入禁用 javascript,就像它开始选择一样。 http://www.icab.de/blog/2010/07/11/customize-the-contextual-menu-of-uiwebview/

UIWebView without Copy/Paste and selection rectangle when showing documents

【讨论】:

  • 答案不再有效,因为您的链接已损坏。
  • VagueExplanation 我添加了一个替代链接
【解决方案2】:

对于任何可以在 HTML 级别操作的人来说,JavaScript 解决方案是必经之路(从此处 [1] 提取 JavaScript 部分)。

对于无法修改 HTML 页面的开发人员,[1] 解决方案适用于 99% 的客户端,并且非常干净和安全。

但是对于长按链接或复制粘贴或放大镜等时出现的弹出窗口应该永远不会的情况,那么这就是我的工作解决方案。 (JavaScript 注入失败的情况是页面需要一些时间来加载并且用户在此期间长按链接)。

要解决这个问题,只需将此协议实现粘贴到代码中几乎任何地方(不要偷懒...创建一个新的类别文件)。请注意,这个解决方案是危险的,至少在理论上,在现实生活中(即从 iOS 6.0.2 开始)它并不危险。请了解哪些类别以及此解决方案涉及哪些内容。

@implementation UIScrollView (CustomGestureCollisionHandling)

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{

    for(UIView *aView in gestureRecognizer.view.subviews)
    {
        for (UIGestureRecognizer *gestRec in aView.gestureRecognizers) 
        {
            if (!gestRec.enabled) 
            {
                continue;
            }

            if ([[NSString stringWithFormat:@"%@",[gestRec class]] isEqualToString:@"UITapAndAHalfRecognizer"]) 
            {
                gestRec.enabled = NO;
            }
        }
    }

    if ([otherGestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) 
    {
        otherGestureRecognizer.enabled = NO;
    }

    return NO;

}

@end

[1]https://stackoverflow.com/a/5548362/428143

【讨论】:

  • 这对我来说是一个救命稻草,我可以禁用真正烦人的双击并按住功能,它会打开一个放大镜 - 谢谢!!
  • Pre-iOS 9,这是一个很棒的解决方案!但是,在 iOS 9 中,突然在我的应用程序中,用户无法关闭 UIAlertView 和 UIAlertController。事实证明,在 iOS 9+ 上,CustomGestureCollisionHandling 类别会干扰 UIAlertView 和 UIAlertController 使用的手势识别器。根据 Apple 的说法,“不支持将类别附加到覆盖方法的默认实现或为该 UIKit 类使用的对象实现委托方法的 UIKit 类,并且容易在不同版本之间中断。”只是一个提示。
【解决方案3】:

试试这个

[webView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitTouchCallout='none'; document.body.style.KhtmlUserSelect='none'"];

【讨论】:

  • 这个解决方案对我不起作用。谁能帮我停止在 UiWebView 上显示复制和粘贴弹出窗口
【解决方案4】:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
 [iWebView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitTouchCallout='none';  document.body.style.KhtmlUserSelect='none'"];
}

【讨论】:

    【解决方案5】:

    在 iOS 5、6、7 中测试:

    隐藏整个上下文菜单:

    [[UIMenuController sharedMenuController] setMenuVisible:NO];

    关于事件 UIMenuControllerWillShowMenuNotification

    Example

    请注意,选择器会在延迟后再次触发。在示例中,他们使用 0.15 秒。我用的是 0.001。这样可以更好地防止外观 - 或者至少减少菜单可见/可用的时间。

    【讨论】:

      【解决方案6】:

      我希望这对你有用,因为它对我有用

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

      【讨论】:

      • 我认为这是最好的解决方案。使用(内联)CSS 也可以做到这一点: * { -webkit-touch-callout: none; -webkit 用户选择:无; }
      猜你喜欢
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      • 2019-09-24
      相关资源
      最近更新 更多