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

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

enter image description here.

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

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

Ответ 1

Прежде всего удалите встроенный долговременный распознаватель жестов, например:

for(UIGestureRecognizer *gesRecog in yourWebView.gestureRecognizers)
    {
        if([gesRecog isKindOfClass:[UILongPressGestureRecognizer class]])
        {
            [startTF removeGestureRecognizer:gesRecog];
        }
    }

Затем назначьте пользовательский:

    UILongPressGestureRecognizer *myOwnLongPressRecog = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleWebViewLongpress:)];

        // set numberOfTapsRequired and numberOfTouchesRequired as per your requirement:       

[yourWebView addGestureRecognizer:myOwnLongPressRecog];

//Ручка Длительное нажатие:

 - (void) handleWebViewLongpress: (UIGestureRecognizer *) recog
    {
     int zoomedWidth = [[yourWebView stringByEvaluatingJavaScriptFromString:@"window.innerWidth"] intValue];

        CGFloat scale = yourWebView.frame.size.width / zoomedWidth;  // get the scaled value of your web view

        CGPoint zoomedCords = [gesture locationInView:self.webView];

        zoomedCords.x /= scale; // Normal math. Divide by the scale to get the real thing.
        zoomedCords.y /= scale;

NSLog(@"%@", zoomedCords);

            }

Ответ 2

Это должно быть выполнено почти полностью в 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.

Ответ 3

Вы пробовали это?

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(getCoordinates:)];
//  [longPress setMinimumPressDuration:1];
[yourWebView addGestureRecognizer:longPress];


- (void)getCoordinates:(UILongPressGestureRecognizer *)sender {

CGPoint location = [sender locationInView:self.view];
NSLog(@"Tap at %1.0f, %1.0f", location.x, location.y);

}

Ответ 4

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

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

  • Дождитесь полной загрузки веб-представления.
  • Перейдите через подпрограммы UIWebView, как описано Ole Begemann здесь.
  • Как только вы достигнете UITextView, нажмите на свой метод делегирования, вы можете сделать что-то похожее на цепочку делегатов, чтобы получить это - здесь сообщение об этом
  • Внедрите метод UITextViewDelegate textViewDidChangeSelection:, чтобы получить выбранный Range и взаимодействовать с ним.

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