Установка динамического пути исключения 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];