2014-11-17 2 views
4

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

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

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

+3

ли вы найти решение для этого. Иногда у меня такая же проблема с добавлением новых строк. – pkuhar

ответ

0

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

A: Обнаружить недействительный результат из caretRectForPosition. В моем случае недопустимые координаты кажутся всегда либо большими отрицательными значениями (-1.0, по-видимому, является i.O.!), Либо «бесконечным» для 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 ... 
}