【问题标题】:How to move cursor of UITextView to TOUCHED LOCATION?如何将 UITextView 的光标移动到 TOUCED LOCATION?
【发布时间】:2013-12-18 16:39:18
【问题描述】:

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

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

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

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 中的光标移动到我从识别器获得的位置?

谢谢。

【问题讨论】:

  • 这是正常的 iOS 行为。

标签: ios iphone uitextview


【解决方案1】:
- (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]];
    }
}

【讨论】:

    【解决方案2】:

    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)
    
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多