向上滚动时动态设置 UITextView 排除路径会导致无限循环

Posted

技术标签:

【中文标题】向上滚动时动态设置 UITextView 排除路径会导致无限循环【英文标题】:Setting a UITextView exclusion path dynamically while scrolling up causes an infinite loop 【发布时间】:2015-04-11 10:57:51 【问题描述】:

我在 UIViewController 中有一个 UITextView。在那个 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: 更改导致 -scrollViewDidScroll: 触发的 textView 布局,这就是导致循环的原因。

我仍然对避免这种情况的方法感兴趣。 提前感谢任何愿意花时间的人。

【问题讨论】:

【参考方案1】:

也在为此苦苦挣扎。我这样做的方式是在 UITextViewTextDidChangeNotification 监听器中添加我的排除路径:

  [[NSNotificationCenter defaultCenter] addObserver:self
                                       selector:@selector(didReceiveTextViewNotification:)
                                           name:UITextViewTextDidChangeNotification
                                         object:self];

【讨论】:

以上是关于向上滚动时动态设置 UITextView 排除路径会导致无限循环的主要内容,如果未能解决你的问题,请参考以下文章

UITextView textContainer排除路径在视图控制器的中间时不起作用

粘贴长文本时UITextView动态高度滚动不起作用

UITextView 避免键盘滚动

UITextView 的内容大小在环绕排除路径后没有改变

在图像上淡出滚动 UITextView?

具有边缘到边缘排除路径的 UiTextView 导致所有文本消失