如何将UITextView的光标移动到触摸位置



我的问题的目标是制作类似iOS的笔记应用程序。iOS的note应用程序的要点是,它们提供给用户使用超链接、电话号码链接或电子邮件地址作为蓝色文本颜色,我们可以同时编辑文本。

通常,当我们按下UITextView时,它会将光标定位到我们触摸的位置。但如果我使用UITextView的dataDetectorTypes来放置电话号码或http链接(如iOS的note应用程序),我应该将其设置为不可编辑,否则链接将不起作用。这意味着我无法单击UITextView和Edit text。

但我可以使用下面的代码将其设置为可编辑

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
action:@selector(editTextRecognizerTabbed:)];

-

- (BOOL) editTextRecognizerTabbed:(UITapGestureRecognizer *) aRecognizer
{
textview.editable = YES;
textview.dataDetectorTypes = UIDataDetectorTypeNone;
[textview becomeFirstResponder];
}

现在我可以编辑文本,一切都很好,但问题是它总是从文本的末尾开始,所以用户应该再次点击他们想写的地方。我理解原因。

现在我想把光标移动到我在第一个点按下的位置,我通过使用[aRecognizer locationInView:view]得到坐标;

那么如何将UITextView中的光标移动到我从识别器得到的位置?

谢谢。

- (void) editTextRecognizerTabbed:(UITapGestureRecognizer *) aRecognizer
{
if (aRecognizer.state==UIGestureRecognizerStateEnded)
{
//Not sure if you need all this, but just carrying it forward from your code snippet
textview.editable = YES;
textview.dataDetectorTypes = UIDataDetectorTypeNone;
[textview becomeFirstResponder];
//Consider replacing self.view here with whatever view you want the point within
CGPoint point = [aRecognizer locationInView:self.view];
UITextPosition * position=[textView closestPositionToPoint:point];
[textView setSelectedTextRange:[textView textRangeFromPosition:position toPosition:position]];
}
}

Swift 4:中的以上答案

tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.textViewTapped(recognizer:)))
textView.addGestureRecognizer(tapGesture)
@objc func textViewTapped(recognizer: UITapGestureRecognizer) {
if recognizer.state == .ended {     
textView.isEditable = true
textView.becomeFirstResponder()
let location = recognizer.location(in: textView)
if let position = textView.closestPosition(to: location) {
let uiTextRange = textView.textRange(from: position, to: position)
if let start = uiTextRange?.start, let end = uiTextRange?.end {
let loc = textView.offset(from: textView.beginningOfDocument, to: position)
let length = textView.offset(from: start, to: end)
textView.selectedRange = NSMakeRange(loc, length)
}
}
}
}

最新更新