UIWebView без копирования / вставки и выделения прямоугольника при отображении документов - PullRequest
6 голосов
/ 01 апреля 2011

В моем приложении я хочу отключить копирование / вставку / вырезку содержимого, отображаемого объектом 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 по-прежнему показывает «прямоугольник выбора», как вы можете видеть на следующем снимке экрана:

Selection rectangle

ПРИМЕЧАНИЕ. Содержимое, отображаемое в UIWebView, не является HTML-страницами. Я показываю файлы документов (PDF, DOC, PPT), загруженные из файла с использованием:

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

Есть ли способ отключить / скрыть эту функцию прямоугольника выделения тоже?

[] s,

Ответы [ 2 ]

14 голосов
/ 01 апреля 2011

Вы можете попробовать добавить javascript в webView. Этот код работает на iPhone тоже, но только когда страница полностью загружена. http://www.javascriptsource.com/page-details/disable-text-selection.html или http://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 :) в список отключенных селекторов?

EDIT: Хорошо, если вы хотите отобразить PDF, а не HTML-страницу, вы можете попробовать это.

Настройка

Поместить веб-представление в scrollView;

Установите ScrollView: делегат для себя; минимальное увеличение до 1,0 и максимальное увеличение до того, что вы хотите;

После завершения загрузки weView. Сканирование для первого 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;
}

Чтобы включить масштабирование, вам нужно добавить дополнительный метод из делегата scrollViews.

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

И вы можете загрузить пример проекта http://www.multiupload.com/P8SOZ4NW6C (Это проект xcode 4).

ПРИМЕЧАНИЯ : масштабирование пикселирует содержимое веб-представления, если вы увеличиваете изображение слишком сильно, потому что веб-представление не знает, как заново визуализировать объекты, и по этой причине вы не можете нажимать ссылки (но в 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 it может установить его до загрузки страницы, а не после завершения загрузки страницы. .

0 голосов
/ 02 января 2014

Я нашел ответ от Джонни Рокекса, и он работал как чемпион. Он работает для документов (включая файлы .pdf), отображаемых в UIWebView. UIWebView без копирования / вставки при отображении файлов PDF

...