¿Cómo get las coorderadas para el text seleccionado en UIWebView?

Tengo UIWebView simple con el file html cargado. Quiero mostrar al PopOverController apuntando al text seleccionado como:

introduzca la descripción de la imagen aquí .

Quiero las coordinates del text seleccionado desde UIWebView . Si configuro la propiedad scalesPageToFit de UIWebView en NO , este enlace funciona bien. Si configuro la propiedad scalesPageToFit de UIWebView en YES , fallará.

Cualquiera me ayude a resolver mi problema.

En primer lugar, elimine el reconocimiento nativo de pulsaciones largas de prensa como este:

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

Luego asigna una personalizada:

  UILongPressGestureRecognizer *myOwnLongPressRecog = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleWebViewLongpress:)]; // set numberOfTapsRequinetworking and numberOfTouchesRequinetworking as per your requirement: [yourWebView addGestureRecognizer:myOwnLongPressRecog]; 

// Manejar Pulsación larga como esta:

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

Esto debe llevarse a cabo casi por completo dentro de JavaScript y luego tener el resultado pasado al Objetivo C. Si tiene control del contenido que está mostrando, puede agregar esta function a una label <script> . De lo contrario, deberá inyectarlo como se describe en esta publicación .

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

Entonces, desde su código de Objective C, usa hacer algo como esto:

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

Voy a agregar que esto obtendrá las coorderadas que son válidas dentro de su webView.scrollView , no su webView .

¿Has probado eso?

 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 en realidad convierte el HTML en UIViews, específicamente, probablemente proporcionará el text seleccionable en UITextView, por lo que lo que debe hacer es tratar de acceder a los methods de delegado de la vista correcta.

Aquí hay un truco que debería funcionar:

  1. Espere hasta que la vista web esté completamente cargada.
  2. Recorra las subvistas de UIWebView como lo describió Ole Begemnn aquí .
  3. Una vez que llegue a una UITextView, toque en su método de delegado, podría hacer algo similar a una cadena de delegates para get esto; aquí hay una publicación sobre ella
  4. Implemente el método UITextViewDelegate textViewDidChangeSelection: para get el UITextViewDelegate seleccionado e interactuar con él.

** Una alternativa a los pasos 3 y 4 es usar KVO para escuchar los cambios en el range seleccionado de textView.