2011-09-27 20 views
1

我有一个程序与NSTextView(实际上,一个自定义的子类),其中很多行数据可能被编程插入。 (它从USB端口读取串行数据流。)我有一个用于启用/禁用自动滚动的复选框。我想允许用户简单地通过尝试向后滚动来摆脱自动滚动。所以,我需要一个通知,告诉我用户何时滚动,而不仅仅是边界发生了变化,因为每次插入更多的串行数据时都会发生这种情况。这可能吗?NSNotification滚动 - 用户与编程

回答

1

当然你可以使用通知,告诉你何时滚动发生,然后检查文本视图是否完全滚动到底部?如果是,请开启自动滚动功能。如果没有,请关闭它。

+0

是的,这基本上是我最终做的。 – Andrew

0

这不是最好的,但这在我的情况。我认为可以通过一些NSEvent操作来完成一些清理工作,但是我意识到我可以通过检查当前滚动位置与总文档矩形高度来检查用户是否已经开始滚动。

NSRect totalRect = [[serialScrollView contentView] documentRect]; 
NSRect visibleRect = [[serialScrollView contentView] documentVisibleRect]; 
NSInteger totalHeight = totalRect.size.height; 
NSInteger visibleHeight = visibleRect.size.height; 
NSInteger position = visibleRect.origin.y; 

NSInteger scrollPoint = position + visibleHeight; 

if (totalHeight != scrollPoint) 
    [autoscrolls setState:0]; 

所以基本上,如果滚动位置变得比程序期望它是从程序写入的任何其他,它变成自动滚动关闭。关于这个实现的一个很酷的事情是,如果你的广告是else [autoscrolls setState:1];,那么当你向下滚动以追赶流时,它会重新开启自动滚动。当你运行一个有很多输出的shell脚本时,这将模拟终端中的滚动行为,比如Fedora上的yum install或者类似的东西。