Как переместить курсор в начало текущей строки в UITextView? - PullRequest
3 голосов
/ 19 ноября 2011

Мне нужна кнопка вставки вкладки для моего UITextView, чтобы пользователи могли вставлять вкладку в начале текущей строки. Независимо от того, где находится курсор в строке, вкладка должна быть вставлена ​​в начало строки, а после этого курсор должен идти до конца строки.

Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 13 июня 2012

Мне не повезло с positionFromPosition:inDirection:offset: и characterRangeByExtendingPosition:inDirection:.

Но у меня это прекрасно работает:

UITextRange *range = [textView selectedTextRange];
CGRect rect = [textView caretRectForPosition:range.start];
UITextPosition *start = [textView closestPositionToPoint:CGPointMake(0, rect.origin.y)];
[textView setSelectedTextRange:[textView textRangeFromPosition:start toPosition:start]];

UPD: код вышепроверено на iOS7 и ранее.И больше не может работать с iOS9.На самом деле, у меня есть ошибки в приложении для редактирования текста, работающем на iOS9-устройствах.Я обновлю свой ответ после исправления приложения.

2 голосов
/ 19 ноября 2011

UITextView реализует протокол UITextInput, который имеет целый набор методов для определения позиций текста. Я не уверен в этом, но, возможно, вы можете позвонить:

  1. selectedTextRange чтобы получить позицию каретки.
  2. positionFromPosition:inDirection:offset: с помощью UITextLayoutDirectionLeft, чтобы найти диапазон до начала текущей строки. (В этом я не уверен; может быть, characterRangeByExtendingPosition:inDirection: будет работать лучше?)
  3. Используйте textRangeFromPosition:toPosition:, чтобы получить диапазон для начала линии.
  4. Используйте replaceRange:withText: для вставки вкладки.

В этом протоколе могут быть другие методы, которые позволят вам выяснить, если это не сработает.

Редактировать: похоже, что UITextView реализует UITextInput только с iOS 5. Если вы нацеливаетесь до этого, я не уверен, что предложить.

0 голосов
/ 02 февраля 2016

Я добавлю код, который использовал для перемещения курсора в начало строки (homeTap), так как он обращается к некоторым комментариям в ответе @ zxcat относительно перемещения курсора в началоиз предыдущей строки, а не текущей строки:

- (void)homeTap:(id)s {
    UITextRange* range = [_textView selectedTextRange];
    CGRect rect = [_textView caretRectForPosition:range.start];
    float halfLineHeight = _textView.font.lineHeight / 2.0;
    UITextPosition* start = [_textView closestPositionToPoint:CGPointMake(0, rect.origin.y + halfLineHeight)];
    [_textView setSelectedTextRange:[_textView textRangeFromPosition:start toPosition:start]];
}

В частности, я добавляю halfLineHeight к rect.origin.y, чтобы убедиться, что результат из closestPositionToPoint относится к текущей строке.

...