Как получить координаты выбранного текста в UIWebView?
у меня просто UIWebView
с загруженным html-файлом. Я хочу показать PopOverController
указал на выделенный текст как -
.
Я хочу 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, поэтому вам нужно попытаться подключиться к методам делегата правильного представления.
вот хак, который должен работать:
- дождитесь полной загрузки веб-представления.
- пройдите по подвидам UIWebView, как описано Ole Begemann здесь.
- как только вы достигнете крана UITextView в свое метод делегата, вы можете сделать что - то похожее на цепочку делегатов, чтобы получить это -вот сообщение об этом
- реализовать
UITextViewDelegate
методtextViewDidChangeSelection:
чтобы получить selectedRange и взаимодействовать с ним.
** альтернативой шагу 3 и 4 является использование KVO для прослушивания изменений в selectedRange textView.