UITextView caretRectForPosition неправильное значение для последнего символа после нажатия клавиши удаления

У меня есть метод для изменения текста в моем веб-представлении, чтобы обнаружить видимый прямоугольник для текущей позиции каретки.

UITextPosition *endPos = self.selectedTextRange.end;   
CGRect rect = [self caretRectForPosition:endPos];
[self scrollRectToVisible:rect animated:NO];

Он прекрасно работает, за исключением случаев, когда я нахожусь в конце документа и нажимаю клавишу удаления на клавиатуре. В этом случае он прокручивается к началу документа, что является неожиданным.

1 ответ

У меня была похожая проблема... кажется, проблема синхронизации в текстовом представлении. Мое решение:

A: Обнаружить недопустимый результат из caretRectForPosition. В моем случае недопустимые координаты всегда кажутся либо большими отрицательными значениями (-1,0 кажется iO!), Либо "бесконечными" для origin.y.

B: повторно спросите текстовое представление для позиции каретки через короткий промежуток времени. Я проверил несколько значений для задержки; 0,05, кажется, достаточно много.

Код:

- (void)textViewDidChange:(UITextView *)pTextView {

    UITextPosition* endPos = pTextView.selectedTextRange.end;

    CGRect          caretRectInTextView = [pTextView caretRectForPosition:endPos];

    if ((-1.0 > CGRectGetMinY(caretRectInTextView)) ||
        (INFINITY == CGRectGetMinY(caretRectInTextView))) {
        NSLog(@"Invalid caretRectInTextView detected!");

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.05 * NSEC_PER_SEC)),
                       dispatch_get_main_queue(),
                       ^{
                           // Recall
                           [self textViewDidChange:pTextView];
                        });
        return;


    }

    ... your code ...
}
Другие вопросы по тегам