向上滚动时动态设置 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 排除路径会导致无限循环的主要内容,如果未能解决你的问题,请参考以下文章