3

我在 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 布局,这就是导致循环的原因。

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

4

1 回答 1

0

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

  [[NSNotificationCenter defaultCenter] addObserver:self
                                       selector:@selector(didReceiveTextViewNotification:)
                                           name:UITextViewTextDidChangeNotification
                                         object:self];
于 2016-07-21T01:39:16.960 回答