Установка динамического пути исключения UITextView при прокрутке вверх вызывает бесконечный цикл

У меня есть UITextView в UIViewController. Перед этим UITextView находится еще один UIViewController, содержащий две кнопки. Две кнопки являются статическими, и они скрывают текст в текстовом представлении.

Я пытаюсь добиться пути исключения текста, который оборачивается вокруг двух кнопок, и при прокрутке представления текста путь исключения пересчитывается, поэтому текст всегда отображается на 100%. Для этого я установил начальный путь исключения в -viewWillAppear, а затем использовал -scrollViewDidScroll: и scrollView.contentOffset, чтобы пересчитать путь исключения.

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

Если я войду в -scrollViewDidScroll: я получу это:

content offset = {0, 932}
content offset = {0, 584}
content offset = {0, 932}
content offset = {0, 584}
content offset = {0, 932}
content offset = {0, 584}
etc

Так как scrollView прокручивается вверх, он пересчитывает путь исключения, который толкает текст вниз и толкает scrollView вниз... Я думаю, что это то, что происходит. Хотя 350pxs кажется большой разницей, когда это просто слово или два, которые перемещаются на следующую строку.

Мой вопрос: почему это происходит и что я могу сделать, чтобы это исправить?

Вот код:

-(void)viewWillAppear:(BOOL)animated{
   [super viewWillAppear:animated];
   [self updateExclusionPathWithYOffset:0.0f
                                  width:30.0f];
}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
   NSLog(@"content offset =  %@",NSStringFromCGPoint(scrollView.contentOffset));
   [self updateExclusionPathWithYOffset:scrollView.contentOffset.y
                                  width:30.0f];
}

 -(void)updateExclusionPathWithYOffset:(CGFloat)yOffset width:(CGFloat)width{
   CGRect rect = CGRectMake(self.textView.bounds.size.width -width,
                         -10.0f + yOffset,
                         width,
                         105.0f);
   UIBezierPath *path = [UIBezierPath bezierPathWithRect:rect];
   [[self.textView textContainer]setExclusionPaths:@[path]];
 }

** Редактировать ** Кажется, я упустил очевидное. -updateExclusionPathWithYOffset: width: изменяет макет textView, который вызывает -scrollViewDidScroll: запускать, что и вызывает цикл.

Я все еще интересуюсь способом избежать этого. Заранее спасибо всем, кто найдет время.

1 ответ

С этим тоже боролся. Я сделал это, добавив путь / пути исключения в прослушиватель UITextViewTextDidChangeNotification:

  [[NSNotificationCenter defaultCenter] addObserver:self
                                       selector:@selector(didReceiveTextViewNotification:)
                                           name:UITextViewTextDidChangeNotification
                                         object:self];
Другие вопросы по тегам