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

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

enter image description here.

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

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

4 ответов


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

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);

            }

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


вы пробовали это делать?

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);

}

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

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

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

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