我在 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 布局,这就是导致循环的原因。
我仍然对避免这种情况的方法感兴趣。提前感谢任何愿意花时间的人。