为了管理内容可编辑的UIWebView中的自动滚动,我需要获得正确的插入符Y垂直坐标。
我使用javascript确定了两种方法。
第一个使用getClientRects javascript函数:
CGRect caretRect = [self.webView stringByEvaluatingJavaScriptFromString: @"
var sel = document.getSelection();
var range = sel.getRangeAt(0).cloneRange();
range.collapse(true);
var r =range.getClientRects()[0];
return '{{'+r.left+','+r.top+'},{'+r.width+','+r.height+'}}';"];
int caretY = caretRect.origin.y;
这样,插入符号一直闪烁,一个问题得到正确的垂直位置,有一个问题:当用户键入返回键时,如果下一行为空,则在键入字符键之前,caretY等于零。所以这种方法无法使用。
第二个插入一个tmp span,然后将其删除:
int caretY = [[self.webView stringByEvaluatingJavaScriptFromString: @"
var sel = window.getSelection();
sel.collapseToStart();
var range = sel.getRangeAt(0);
var span = document.createElement(\"span\");
range.insertNode(span);
var topPosition = span.offsetTop;
span.parentNode.removeChild(span);
topPosition;"] intValue];
这可以在任何情况下提供正确的照顾。但插入符号停止闪烁,这在屏幕上看起来非常无益。
是否有人知道可以做出以下的任何方法(或改编这些方法):
- get the correct caret Y in any situation
- keep the caret blinking in any situation
由于
答案 0 :(得分:1)
不确定这是否为时已晚;以下对我有用。
将下面的getCaretY()添加到您的js文件中:
function getCaretY() {
var y = 0;
var sel = window.getSelection();
if (sel.rangeCount) {
var range = sel.getRangeAt(0);
if (range.getClientRects) {
var rects = range.getClientRects();
if (rects.length > 0) {
y = rects[0].top;
}
}
}
return y;
}
然后从obj-c文件中调用它,如下所示:
NSString *yPos = [webView stringByEvaluatingJavaScriptFromString:@"getCaretY()"];