Как получить смещение от начала строки 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];
}