显示文档时没有复制/粘贴和选择矩形的UIWebView

Edu*_*lho 6 iphone selection uiwebview ipad uiresponder

在我的应用程序中,我想禁用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];
}
Run Code Online (Sandbox Code Playgroud)

现在用户不再可以进行此类操作,但UIWebView仍显示"选择矩形",如以下屏幕截图所示:

选择矩形

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

NSURL *fileURL = [NSURL fileURLWithPath:<document file path..>];
NSURLRequest *fileRequest = [NSURLRequest requestWithURL:fileURL];
[<uiwebView> loadRequest:fileRequest];
Run Code Online (Sandbox Code Playgroud)

有没有办法禁用/隐藏这个选择矩形功能?

[] S,

Kyl*_*lls 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的:委托给自己; 最小缩放到1.0和最大缩放到你想要的任何;

weView完成加载后.在webView中扫描第一个UIScrollView,(我们正在扫描它,所以这不应该在以后的iOS版本中破坏).将UIWebViews框架设置为scrollViews大小.并将scrollView的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;
}
Run Code Online (Sandbox Code Playgroud)

要启用缩放,您需要从scrollViews委托添加额外的方法.

-(UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return webView;
}
Run Code Online (Sandbox Code Playgroud)

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

注意:如果你放大到很多因为webView不知道要重新渲染东西,并且因为你无法点击链接(但在PDF中应该不是问题),缩放会对webView的内容进行像素化处理.

编辑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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你应该只能与UIScrollView本身进行交互,这意味着缩放,滚动,等等......应该仍然可以工作(当你缩放时页面应该重新渲染而不是像素化)但是你不能选择任何文本或类型任何事情.

另外一些关于这种方法是基于UIWebView的子视图的这个名单可能的页面开始加载,而在此之后,它已经完成加载页面之前,可以设置此.

  • 使用更好的解决方案更新答案,应该(未经测试)修复像素化问题,如果您更新了可能需要考虑切换的应用程序. (3认同)