UITextView提供错误的插入符号

时间:2014-10-09 03:40:38

标签: ios uitextview

我的UITextView委托使用以下内容记录插入位置:

- (void)textViewDidBeginEditing:(UITextView *)textView
{
    CGPoint cursorPosition = [textView caretRectForPosition:textView.selectedTextRange.start].origin;
    NSLog(@"cursor: %@", NSStringFromCGPoint(cursorPosition));
}

但报道的位置总是不准确。具体来说,它报告上一个光标位置 - 例如,如果我在文本视图中的位置(x,y)然后在外部单击一次,然后在内部返回(x2,y2),在第二个单击(x,y)坐标。

实际上,selectedTextRange是问题 - 报告了之前的范围。

我错过了什么?我没有看到我可以使用的另一种委托方法。

4 个答案:

答案 0 :(得分:4)

selectedTextRange 的值只会在编辑刚开始时更旧,但尚未更改。当您使用所选文本计算 cursorPostion 时,旧值将导致旧位置。因此,我们需要计算在选择更改后报告的另一个委托内的新位置。您将通过下面提到的代码获得正确的读数。希望它有所帮助

-(void)textViewDidChangeSelection:(UITextView *)textView
{
    CGPoint cursorPosition = [textView caretRectForPosition:textView.selectedTextRange.start].origin;
    NSLog(@"cursor start: %@", NSStringFromCGPoint(cursorPosition));
}

答案 1 :(得分:2)

这是非常糟糕的,但一种解决方案是在阅读调用方法之前引入一个短暂的延迟:

UITextView *textView = note.object;

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    CGPoint cursorPosition = [textView caretRectForPosition:textView.selectedTextRange.start].origin;
    NSLog(@"cursor: %@", NSStringFromCGPoint(cursorPosition));
});

答案 2 :(得分:1)

实际上,我找到了另一个解决方案。

您可以使用UIKeyboardDidShowNotification获取当前selectedTextRange,而不是之前的selectedTextRange。我希望它有所帮助!

答案 3 :(得分:1)

我遇到了同样的问题,但UIKeyboardWillShowNotification。在我的案例中添加了一个小延迟:

func keyboardWillAppear(notification: NSNotification!) {
    dispatch_after_delay(0.01) {            
        if textView.selectedTextRange {
             // at this point range is correct 
        }
    }
}

func dispatch_after_delay(delay:NSTimeInterval, queue: dispatch_queue_t = dispatch_get_main_queue(), block: dispatch_block_t) {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))), queue, block)
}