如何以编程方式调用NSScrollView autoscroll-method

时间:2015-05-27 13:02:36

标签: macos cocoa appkit nsscrollview autoscroll

我有简单的聊天应用程序和基于文本消息视图的NSTableView,如下图所示。 enter image description here 每条消息都包含NSTextView实例,其高度适合所有文本。

我需要的是启动NSScrollView(其中包含NSTableView实例)自动滚动,同时用户选择文本拖动鼠标足够远。不幸的是,自动滚动并没有出现。如果拖动文本视图之外的某个地方都成功。

我尝试直接调用autoscroll: - 方法只需按NSEvent - 来自NSTextView的实例 - 子类"鼠标拖动" -event(如示例来自{ {3}}):

- (void)mouseDragged:(NSEvent *)event
{
  [self.scrollView autoscroll:event];
}

由于我已经覆盖了所有鼠标事件并实现了所有文本选择,因此这种方法经常会调用。但是自动滚动似乎不起作用。

更新

我发现在调用-autoscroll: - 方法之前,必须有-mouseDown:个相同的对象。但它打破了我的文本选择机制。这一点甚至不是第一响应者,除了mouseDown: - 方法之外别无其他。

1 个答案:

答案 0 :(得分:2)

通常,文本视图位于自己的滚动视图中。即使它足够大以显示所有文本而不滚动,它仍然存在。在该滚动视图中的任何内容上调用-autoscroll:(可能包括滚动视图本身?)将仅尝试滚动滚动视图,而不是包含表视图的滚动视图。

尝试在层次结构中较高的视图上调用-autoscroll:self.scrollView.superview,表格单元格视图或表格视图。

但请注意,即使包含文本视图的单元格视图完全在屏幕上,表格视图的滚动视图也会继续滚动。事实上,它可以继续滚动它到另一个方向离开屏幕。基本上,它并不知道您是否尝试在文本视图中进行选择,因此当选择一直延伸到文本视图的边缘时,它不会知道停止。

另一种方法可能是尝试使用"裸"没有封闭滚动视图的文本视图。我不认为IB会让你这样做,所以你必须以编程方式进行。但是,裸体文本视图在自动布局方面不会很好。