【问题标题】:UIWebView without Copy/Paste and selection rectangle when showing documents显示文档时没有复制/粘贴和选择矩形的 UIWebView
【发布时间】:2011-04-01 15:32:07
【问题描述】:

在我的应用程序中,我想禁用 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];

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

[]s,

【问题讨论】:

  • 除非您 100% 确定没有其他人提供相同(或相似)的内容,否则此“功能”只会使人们远离您的应用。
  • @Franci Penov:我可以想到很多用户不希望选择指针出现的情况。事实上,当我阅读某些内容并缓慢滚动(按住手指、阅读、拖动、最终选择但想要滚动)时,它经常会破坏我的用户体验。
  • @Franci:我 100% 肯定没有其他人会提供这样的内容。正在创建该应用程序以显示仅限于某些公众的内容。这个“功能”是客户的要求(否则我当然不会为此烦恼。)@Kal​​le:我完全同意你的意见。

标签: iphone ipad uiwebview selection uiresponder


【解决方案1】:

您可以尝试将 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 框架设置为它的滚动视图大小。 并将 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;
}

要启用缩放,您需要从 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 本身进行交互,这意味着缩放、滚动等.. 应该仍然可以工作(并且页面应该在您缩放时重新渲染而不是像素化)但是您不能选择任何文本, 或输入任何内容。

关于此方法的另外一点是,基于this list of UIWebView subViews,它可能可以在页面开始加载之前而不是在页面加载完成之后设置它。

【讨论】:

  • 感谢您的回答,这在 UIWebView 中显示 HTML 页面时似乎有效。我认为我的问题不够清楚(我会编辑它)。 UIWebView 中显示的内容是 PDF、DOC、PPT、XLS 文件(我只是创建了一个从文件加载的 URLRequest。)
  • 那么您/可能/可以尝试的另一种方法是获取 UIWebView 具有的内容视图的大小,将 webViews 的大小设置为禁用 webView 上的 userInteraction,并将其添加到 UIScrollView它的 contentSize 设置为 webViews 大小,如果你愿意,我会写另一个答案,详细说明。
  • 这看起来像是我的问题的解决方案。我可以设法写出来,但如果可以的话,我想看看你的实现并接受它作为答案。谢谢。
  • @eduardo-coelho 我用所需的主要代码和可以下载的示例项目更新了帖子。
  • 使用更好的解决方案更新了答案,应该(未经测试)修复像素化问题,如果您更新应用程序,您可能需要考虑切换。
【解决方案2】:

我在这里找到了 Johnny Rockex 的答案,它就像一个冠军。它适用于 UIWebView 中显示的文档(包括 .pdf 文件)。 UIWebView without Copy/Paste when displaying PDF files

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多