2010-09-09 2 views
11

Я ищу , не частным образом, чтобы найти позицию курсора или вставки (мигающего бар) в UITextView предпочтительно в качестве CGPoint.положение курсора в UITextView

Возможно, такой вопрос уже существует, но он не дает окончательного способа его выполнения. И, Я не имею в виду NSRange выбранной области.

+0

не могли бы вы рассказать нам, почему вы хотите сделать это для получения дополнительной информации? –

+0

Это для отображения 'UIMenuController'. – Joshua

ответ

20

Просто получил его в другом потоке:

Требуется IOS 3.2 или более поздней версии.

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

Не забудьте проверить, что selectedTextRange не равен нулю перед вызовом этого метода. Вы также должны использовать selectedTextRange.empty, чтобы проверить, что это позиция курсора, а не начало текстового диапазона. Итак:

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

Pixel-Position of Cursor in UITextView

+1

+1 yep, это находится на [''] (http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UITextInput_Protocol/Reference/Reference.html) протокола –

+1

Это не реализовано в iOS 4.3 или ниже, как можно было бы подумать при чтении документации. Он работает только в iOS5 + – bobmoff

0

Нет такого способа. Полная остановка.

Единственное, что вы могли бы сделать, чтобы прийти закрыть заключается в том, чтобы параллельно выложить текст с помощью CoreText, там calcualte текстовое положение из точки и применить это в UITextView. Это, однако, работает только с не-0 выборами. Кроме того, CoreText имеет другой механизм компоновки текста, например, поддерживает кернинг, который UITextView не делает. Это может привести к отклонениям вынесенного и выложенного текста и, таким образом, дать субоптимальные результаты.

Нет абсолютно никакого способа позиционировать каретку. Эта задача даже очень важна, если вы используете частный API. Это всего лишь один из многих «просто не надо» в iOS.

+0

Итак, нет абсолютно никакого способа вычислить положение каретки? – Joshua

+0

Нет. Не с UITextView. Как я уже сказал, вы можете выложить текст во второй раз с помощью CoreText и вычислить позицию там, но это дает вам оценки в лучшем случае. –

2

СВИФТ версии 2.1:

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

print("cursorPosition:\(cursorPosition)") 
0

Swift 4 версия:

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

Мы просто используем textView.selectedTextRange, чтобы получить выбранный диапазон текста и чем textView.caretRect(for:)чтобы получить CGRect, определяющее положение каретки.

Смежные вопросы