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

Den*_*nis 6 caret uiwebview coordinates ios

为了管理内容可编辑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;
Run Code Online (Sandbox Code Playgroud)

这样,插入符号一直闪烁,一个问题得到正确的垂直位置,有一个问题:当用户键入返回键时,下一行为空,在键入字符键之前,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];
Run Code Online (Sandbox Code Playgroud)

这在任何情况下都给出了正确的照顾.但插入符号停止闪烁,这在屏幕上看起来非常无益.

有没有人知道可以做出以下的任何方法(或这些方法的改编):

    - get the correct caret Y in any situation
    - keep the caret blinking in any situation
Run Code Online (Sandbox Code Playgroud)

谢谢

小智 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;
}
Run Code Online (Sandbox Code Playgroud)

然后从 obj-c 文件中调用它,如下所示:

NSString *yPos = [webView stringByEvaluatingJavaScriptFromString:@"getCaretY()"];
Run Code Online (Sandbox Code Playgroud)