Прокрутите текст до определенной точки в UITextView в зависимости от размера шрифта - PullRequest
0 голосов
/ 29 августа 2018

Я хочу, чтобы мой UITextView прокручивал до определенной точки (слово или, лучше, точка останова: ">>>"), когда пользователь нажимает кнопку вне самого текстового представления (на iOS). Размер шрифта может варьироваться в зависимости от взаимодействия с пользователем (то есть пользователь может увеличивать или уменьшать размер шрифта). Сам текст вставляется пользователем (который интерактивно добавляет точки останова).

Я пытаюсь добиться этого, получая y-позиции (в пикселях) точек останова (">>>"), а затем устанавливаю смещение textView в соответствии (с setContentOffset).

Проблема в том, что у меня неправильные очки!

Вот фрагмент моего кода (только для одного повторения ">>>"):

NSRange range = [self.textview.text rangeOfString:@">>>"];

UITextPosition *beginning = self.textview.beginningOfDocument;
UITextPosition *start = [self.textview positionFromPosition:beginning offset:range.location];
UITextPosition *end = [self.textview positionFromPosition:start offset:range.length];
UITextRange *textRange = [self.textview textRangeFromPosition:start toPosition:end];
CGRect rect = [self.textview firstRectForRange:textRange];

[self.textview setContentOffset:CGPointMake(0, rect.origin.y)];

Что не так с моим подходом? Я чувствую, что есть лучший (и более простой) способ сделать то же самое ...

PS: я нашел другую тему, связанную с той же проблемой, но она быстро, и я не могу перевести ее: Прокрутите UITextView к определенному тексту

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Я попробовал описанную выше вещь быстро и понял, что нет смысла вычислять прямоугольник и затем прокручивать до этого прямоугольника. Вы можете просто позвонить func scrollRangeToVisible(_ range: NSRange), чтобы перейти к слову в textView.

let range: Range = self.textView.text.range(of: "amendment")!
let nsRange = NSRange(range, in: self.textView.text)

self.textView.scrollRangeToVisible(nsRange)
0 голосов
/ 29 августа 2018

Вам необходимо преобразовать rect в координатное пространство текстовых представлений.

Попробуйте это так:

// get the range
NSRange range = [self.textview.text rangeOfString:@">>>"];

// get the rect in the textview's coordinate space
CGRect foundRect = [self frameOfTextRange:range inTextView:self.textview];

// scroll the found rect into view
[self.textview setContentOffset:CGPointMake(0.0, foundRect.origin.y) animated:YES];

с использованием этого метода (можно найти здесь: https://stackoverflow.com/a/9606413/6257435):

- (CGRect)frameOfTextRange:(NSRange)range inTextView:(UITextView *)textView
{
    // ensure textview layouManager has been processed
    [textView.layoutManager ensureLayoutForTextContainer:textView.textContainer];

    UITextPosition *beginning = textView.beginningOfDocument;
    UITextPosition *start = [textView positionFromPosition:beginning offset:range.location];
    UITextPosition *end = [textView positionFromPosition:start offset:range.length];
    UITextRange *textRange = [textView textRangeFromPosition:start toPosition:end];
    CGRect rect = [textView firstRectForRange:textRange];
    return [textView convertRect:rect fromView:textView.textInputView];
}

Вам, конечно, потребуется добавить обработку ошибок (для текста, который не найден и т. Д.).

...