NSNotification滚动 - 用户与程序化

时间:2011-09-27 05:35:26

标签: objective-c cocoa scroll notifications

我有一个带有NSTextView的程序(实际上是一个自定义子类),很可能会以编程方式插入很多行数据。 (它从USB端口读取串行数据流。)我有一个启用/禁用自动滚动的复选框。我想让用户只需尝试向上滚动就可以打破自动滚动。因此,我需要一个通知,告诉我何时滚动用户,而不仅仅是当边界发生变化时,因为每次插入更多的串行数据时都会发生这种情况。这可能吗?

2 个答案:

答案 0 :(得分:1)

当然,您可以使用通知告诉您何时进行滚动,然后检查文本视图是否完全滚动到底部?如果是,请打开自动滚动。如果没有,请将其关闭。

答案 1 :(得分: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或类似的东西。