Joshua
Joshua

Reputation: 15500

Cursor position in a UITextView

I am looking for a non private way to find the position of the Cursor or Caret (blinking bar) in a UITextView preferably as a CGPoint.

There may be a question like this already but it does not provide a definitive way for doing it. And, I do not mean the NSRange of the selected area.

Upvotes: 13

Views: 13902

Answers (4)

Milan Nosáľ
Milan Nosáľ

Reputation: 19737

Swift 4 version:

// lets be safe, thus if-let
if let selectedTextRange = textView.selectedTextRange {
    let caretPositionRect = textView.caretRect(for: selectedTextRange.start)
    let caretOrigin = caretPositionRect.origin
    print(">>>>> position rect: \(caretPositionRect), origin: \(caretOrigin)")
}

We simply use textView.selectedTextRange to get selected text range and than textView.caretRect(for:) to get CGRect defining position of the caret.

Upvotes: 0

Trevor
Trevor

Reputation: 1059

SWIFT 2.1 version:

let cursorPosition = infoTextView.caretRectForPosition( (infoTextView.selectedTextRange?.start)! ).origin

print("cursorPosition:\(cursorPosition)")

Upvotes: 2

civic.LiLister
civic.LiLister

Reputation: 2197

Just got it in another thread:

Requires iOS 3.2 or later.

CGPoint cursorPosition = [textview caretRectForPosition:textview.selectedTextRange.start].origin;

Remember to check that selectedTextRange is not nil before calling this method. You should also use selectedTextRange.empty to check that it is the cursor position and not the beginning of a text range. So:

if (textview.selectedTextRange.empty) {
// get cursor position and do stuff ...
}

Pixel-Position of Cursor in UITextView

Upvotes: 22

Max Seelemann
Max Seelemann

Reputation: 9364

There is no such way. Full stop.

The only thing you could do to come close is to in parallel lay out the text using CoreText, there calcualte the text position from a point and apply that on the UITextView. This, however, works with non-0 selections only. In addition CoreText has a different text layout engine, that e.g. supports kerning, which UITextView doesn't. This may result in deviations of the rendered and laid out text and thus give sub-optimal results.

There is absolutely no way to position the caret. This task is even very though if you do use private API. It's just one of the many "just don't" in iOS.

Upvotes: 0

Related Questions