如何在UIWebView中禁用复制和粘贴

时间:2011-07-13 08:48:30

标签: iphone uiwebview uigesturerecognizer

当用户长按UIWebView时,会有一个Copy&粘贴弹出窗口。可以通过弹出复制和放大来禁用系统吗?粘贴功能,但仍然允许用户点击链接并转到新页面?

6 个答案:

答案 0 :(得分:4)

试试这个

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

对于任何可以在HTML级别操作的人来说,JavaScript解决方案都是可行的方法(从这里提取JavaScript部分[1])。

对于无法修改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

答案 3 :(得分: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

答案 4 :(得分:0)

在iOS 5,6,7中测试:

隐藏整个上下文菜单:

[[UIMenuController sharedMenuController] setMenuVisible:NO];

关于事件UIMenuControllerWillShowMenuNotification

Example

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

答案 5 :(得分:-1)

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