Как получить смещение от начала строки UITextRange.start

У меня есть UITextView, который может иметь несколько строк. Все, что меня интересует, - это положение курсора на определенной строке (где не имеет значения, первая, вторая, третья строка и т. Д.).

Я регистрирую UITextRange.start, который дает мне именно то, что мне нужно, а именно свойство смещения:

cp <UITextPositionImpl: 0x6e93260> <<WebVisiblePosition: 0x6e92d00>(offset=5, context=([d|], [u+0064|u+0000])>

Мой вопрос, как я получаю смещение =5 в просто целое число?

Вот мой код:

UITextRange *caretPositionRange = textView.selectedTextRange;
NSLog(@"cp %@", caretPositionRange.start);

Все, что мне нужно, это что-то вроде int cp = caretPositionRange.start.offset, которое не работает.


редактировать:

чтобы уточнить, меня особенно интересует положение курсора каждой строки, а не всего TextView. Так что на самом деле это не сработает:

UITextRange *caretPositionRange = tv.selectedTextRange;
    int caretPosition = [tv offsetFromPosition:tv.beginningOfDocument
                            toPosition:caretPositionRange.start];

так как это даст мне другую позицию для каждой строки.


редактировать 2:

Ответ ниже, данный Джесси, работает очень хорошо. В первый раз я получил EXC_BAD_EXCESS, так как я не проверял, если startOfLine = nil, так что не забывайте проверять, не равен ли он nil.

1 ответ

Решение

Вам нужно будет спросить UITextView через его методы UITextInput. Что-то вроде этого:

UITextPosition *pos = caretPositionRange.start;
id<UITextInputTokenizer> tokenizer = [textView tokenizer];
UITextPosition *startOfLine = [tokenizer positionFromPosition:pos 
                                                   toBoundary:UITextGranularityLine
                                                 inDirection:UITextStorageDirectionBackward];
if (startOfLine != nil) {
    // based on some experiments, startOfLine may be nil for, eg, empty text views
    // the next line crashes if you pass nil, so we check first
    NSUInteger offset = [textView offsetFromPosition:startOfLine
                                          toPosition:pos];
}
Другие вопросы по тегам