[Javascript] Как получить координаты для выбранного текста в UIWebView?



Answers

Это должно быть выполнено почти полностью в JavaScript, а затем вернуть результат в Objective C. Если вы контролируете контент, который вы показываете, вы можете добавить эту функцию в <script> . В противном случае вам нужно будет ввести его, как описано в этом сообщении .

function rectsForSelection() {
    var i = 0, j = 0;
    var allSelections = window.getSelection();
    var result = []; // An empty array right now
    // Generally, there is only one selection, but the spec allows multiple
    for (i=0; i < allSelections.rangeCount; i++) {
        var aRange = allSelections.getRangeAt(i);
        var rects = aRange.getClientRects();
        for (j=0; j<rects.length; j++) {
            result.push(rects[j]);
        }
    }
    return JSON.stringify(result);
}

Затем из вашего кода Objective C вы используете что-то вроде этого:

NSString *rectsString = [webView stringByEvaluatingJavaScriptFromString:@"rectsForSelection();"];
NSData *rectsData = [rectsString dataUsingEncoding:NSUTF8StringEncoding];
NSArray *rects = [NSJSONSerialization JSONObjectWithData:rectsData
                                                 options:0
                                                   error:NULL]; //Do Your Own Error Checking

Я добавлю, что это даст координаты, которые действительны в вашем webView.scrollView , а не в вашем webView .

Question

У меня простой UIWebView с загруженным html-файлом. Я хочу показать, что PopOverController указал на выделенный текст, например:

,

Мне нужны coordinates выбранного текста из UIWebView . Если я установил свойство scalesPageToFit UIWebView в NO , то эта ссылка работает нормально. Если я установил для свойства scalesPageToFit UIWebView значение « YES , значит, он терпит неудачу.

Кто-нибудь, пожалуйста, помогите мне разобраться с моей проблемой.




UIWebView фактически отображает HTML в UIViews, в частности, он, вероятно, отобразит выбранный текст в UITextView, поэтому вам нужно попытаться использовать методы делегирования правого представления.

Вот хак, который должен работать:

  1. Подождите, пока веб-просмотр будет полностью загружен.
  2. Переходите к подзонам UIWebView, как описано здесь Оле Бегеманном.
  3. Как только вы достигнете UITextView, нажмите на свой метод делегирования, вы можете сделать что-то похожее на цепочку делегатов, чтобы получить это - вот сообщение об этом
  4. UITextViewDelegate метод textViewDidChangeSelection: чтобы получить выбранный диапазон и взаимодействовать с ним.

** Альтернативой шагам 3 и 4 является использование KVO для прослушивания изменений в выбранном элементе TextView.




Links