6

在我的应用程序中,我想禁用 UIWebView 对象显示的内容的复制/粘贴/剪切。为此,我创建了一个 UIWebView 子类并覆盖了该- (BOOL)canPerformAction:(SEL)action withSender:(id)sender方法:

#pragma mark - UIResponderStandardEditActions 

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {    
    if (action == @selector(copy:) ||
        action == @selector(paste:)||
        action == @selector(cut:)) {
        return _copyCutAndPasteEnabled;
    }

    return [super canPerformAction:action withSender:sender];
}

现在用户不能再进行这样的操作,但是 UIWebView 仍然显示“选择矩形”,如下面的截图所示:

选择矩形

注意:UIWebView 中显示的内容不是 HTML 页面。我正在显示使用以下文件从文件加载的文档文件(PDF、DOC、PPT):

NSURL *fileURL = [NSURL fileURLWithPath:<document file path..>];
NSURLRequest *fileRequest = [NSURLRequest requestWithURL:fileURL];
[<uiwebView> loadRequest:fileRequest];

有什么方法可以禁用/隐藏这个选择矩形功能吗?

[]秒,

4

2 回答 2

14

您可以尝试将 javascript 注入 webView。此代码也适用于 iPhone,但仅在页面完全加载时才有效。 http://www.javascriptsource.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/

我能想到的最后一件事可能会起作用,您是否测试过将选择器 @selector(select:) 添加到禁用选择器列表中?

编辑:好的,当你显示 PDF 而不是 html 页面时,你可以试试这个。

设置

将 webView 放在一个 scrollView 中;

将 ScrollView 的:委托设置为 self;最小缩放到 1.0,最大缩放到任何你想要的;

在 weView 完成加载之后。扫描 webView 中的第一个 UIScrollView,(我们正在扫描它,所以这不应该在更高的 iOS 版本上中断)。将 UIWebViews 框架设置为它的滚动视图大小。并将滚动视图的 contentSize 设置为 webViews contentSize(或者现在,它是框架)。

-(void)setup{
    //Get the webView's first scrollView (the one all the content is in).
    UIScrollView *webViewContentView;
    for (UIView *checkView in [webView subviews] ) {
        if ([checkView isKindOfClass:[UIScrollView class]]) {
            webViewContentView = (UIScrollView*)checkView;
            break;
        }
    }

    webView.frame = CGRectMake(0, 0, webViewContentView.contentSize.width, webViewContentView.contentSize.height);
    scrollView.contentSize = webViewContentView.contentSize;
    scrollView.delegate = self;
}

要启用缩放,您需要从 scrollViews 委托中添加一个额外的方法。

-(UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return webView;
}

您可以下载一个示例项目http://www.multiupload.com/P8SOZ4NW6C(这是一个 xcode 4 项目)。

注意:如果您放大太多,则缩放会使 webView 的内容像素化,因为 webView 不知道重新渲染内容,并且您无法单击链接(但在 PDF 中应该不成问题)。

编辑2:更好的方法

自从写这篇文章以来,我已经实现了一个更简单、更容易的方法,它也应该解决像素化问题。

-(void)removeInput{
    UIScrollView *webViewContentView;
    for (UIView *checkView in [webView subviews] ) {
    if ([checkView isKindOfClass:[UIScrollView class]]) {
        webViewContentView = (UIScrollView*)checkView;
            break;
        }
    }

    for (UIView *checkView in [webViewContentView subviews] ) {
        checkView.userInteractionEnabled = NO;
    }
}

现在您应该只能与 UIScrollView 本身进行交互,这意味着缩放、滚动等.. 应该仍然可以工作(并且页面应该在缩放时重新渲染而不是像素化)但是您不能选择任何文本或输入里面的任何东西。

这个方法的另一个特点是,基于这个 UIWebView 子视图列表,可以页面开始加载之前而不是在页面加载完成之后设置它。

于 2011-04-01T16:15:02.443 回答
0

我在这里找到了 Johnny Rockex 的答案,它就像一个冠军。它适用于 UIWebView 中显示的文档(包括 .pdf 文件)。显示 PDF 文件时没有复制/粘贴的 UIWebView

于 2014-01-01T22:35:05.630 回答