如何检测NSScrollView中的内容是否超出显示范围可滚动?
检测NSScrollView中是否存在超出显示范围的文本
你直接对比scrollView.contentSize和scrollView.bounds.size时两者始终一致,核心原因是NSScrollView的contentSize由其document view(通常是承载文本的NSTextView)的尺寸决定,如果document view没有根据文本内容正确计算自身高度,就会导致contentSize和可视区域尺寸同步。
以下是可行的检测方案:
方案1:直接对比文本内容实际高度与可视区域高度
获取document view中文本的真实高度,再和scrollView的可视区域高度(需扣除滚动条占用空间)对比:
NSTextView *textView = (NSTextView *)self.scrollView.documentView; // 获取文本内容的实际高度 CGFloat textContentHeight = [textView.layoutManager usedRectForTextContainer:textView.textContainer].size.height; // 计算可视区域高度(减去垂直滚动条宽度,避免滚动条占用空间影响判断) CGFloat visibleHeight = self.scrollView.bounds.size.height - self.scrollView.verticalScroller.frame.size.width; if (textContentHeight > visibleHeight) { NSLog(@"存在超出显示范围的文本,可滚动"); }
方案2:通过滚动条启用状态判断
如果滚动条的启用状态正常关联内容尺寸,可以直接检查:
if (self.scrollView.verticalScroller.isEnabled) { NSLog(@"存在超出显示范围的文本,可滚动"); }
注意:此方案依赖滚动条的启用设置,若滚动条被强制隐藏但内容确实超出,判断会失效。
关键前提
确保承载文本的NSTextView的textContainer的heightTracksTextView属性设为NO,这样textView才会根据文本内容自动调整自身高度,让scrollView的contentSize正确更新。
内容的提问来源于stack exchange,提问作者user1092808
相关产品推荐
相关产品推荐

