2012-06-10 6 views
2

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

Я входе 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 ф = caretPositionRange.start.offset, который не работает.


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

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

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

как это могло бы дать мне другое положение для каждой линии.


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

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

ответ

4

Вам нужно спросить 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]; 
} 
+0

Это не сработает, поскольку меня не интересует позиция с началаOfDocument, а скорее начало строки. Смещение всегда дает мне точное значение. Если я сделаю то, что вы предлагаете, я получу увеличивающиеся значения, например. Я не всегда получаю смещение = 5, если курсор находится на пятой позиции от начала строки. –

+0

О, ничего себе. Извините, я совершенно неправильно прочитал ваш вопрос. Одну секунду. –

+0

ОК, это должно сделать это сейчас. Возможно, вы захотите использовать UITextLayoutDirectionLeft, в зависимости от того, как он должен обрабатывать текст справа налево. –

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