在UIWebView中获取插入符号(光标)垂直位置

时间:2014-05-06 09:50:40

标签: ios uiwebview coordinates caret

为了管理内容可编辑的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

由于

1 个答案:

答案 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()"];