我的UITextView委托使用以下内容记录插入位置:
- (void)textViewDidBeginEditing:(UITextView *)textView
{
CGPoint cursorPosition = [textView caretRectForPosition:textView.selectedTextRange.start].origin;
NSLog(@"cursor: %@", NSStringFromCGPoint(cursorPosition));
}
但报道的位置总是不准确。具体来说,它报告上一个光标位置 - 例如,如果我在文本视图中的位置(x,y)然后在外部单击一次,然后在内部返回(x2,y2),在第二个单击(x,y)坐标。
实际上,selectedTextRange是问题 - 报告了之前的范围。
我错过了什么?我没有看到我可以使用的另一种委托方法。
答案 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)
}