Как получить координаты для выбранного текста в UIWebView?
У меня есть простой UIWebView
с загруженным html файлом. Я хочу показать, что PopOverController
указывает на выделенный текст, например -
.
Я хочу 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.