如何检测用户何时以及仅用户滚动NSScrollView

时间:2012-03-02 05:16:31

标签: macos cocoa nsscrollview nsscroller

有没有人知道一种方法来检测用户输入滚动NSScrollView的时间,只有用户输入?)

我想要这样做的原因是因为我有一个NSScrollView contentView,它不断增加它的宽度。我想让NSScrollView'锁定'到contentView的右端(即跟踪它),如果用户滚动到contentView的右端,我希望当用户释放'lock'时(只有卷轴)从右端滚动。

我最接近工作的方法是观察NSViewBoundsDidChangeNotification并更改'lock'变量,如下所示:

- (void)drawRect:(NSRect)dirtyRect
{
(...)
    if (lockToEnd) {
        NSLog(@"xAxisView at end");
        NSPoint newScrollOrigin;
        newScrollOrigin.y = 0;
        newScrollOrigin.x = [self frame].size.width - [[self enclosingScrollView] bounds].size.width;
        [self scrollPoint:newScrollOrigin];
    }
}

-(void)SWXAxisViewDidScroll:(NSNotification *)note{
    NSLog(@"XAxisDidScroll: %@",note);
    if ([[[self enclosingScrollView] horizontalScroller] floatValue] > 0.97){
        lockToEnd = YES;
    } else {
        lockToEnd = NO;
    }
}

但是,这是不合适的,因为只要更改了边界就会发送NSViewBoundsDidChangeNotification,因此当contentView的界限增加时,NSScroller会减少它floatValue我的观察方法被调用了。如果我将NSScroller的{​​{1}}设置为1.0,则当floatValue的{​​{1}}首先超过bounds.size.width时,它会重置为0.0 {1}}。因此,我无法判断contentView是否因为用户滚动或bounds.size.width变宽而被发送。

我考虑过继承NSScrollView并使用NSViewBoundsDidChangeNotificationcontentView方法来跟踪用户输入并更新我的锁变量。但是,我担心的是,如果用户滑动其触控板进行滚动,则不会调用这些方法。我认为另一个较小的问题可能是没有根据的,它可能会破坏NSScroller< - > mouseDown:关系,我将不得不重新实现许多滚动功能。

我错过了一种更简单的方法吗?看来我应该能够做到这一点,因为文件一直这样做?我对子类化mouseDragged:的关注是否有效?

0 个答案:

没有答案