1

有谁知道一种方法来检测用户输入何时NSScrollView滚动,并且只有用户输入)?

我想这样做的原因是因为我有一个NSScrollView不断contentView增加它的宽度的 a 。如果用户滚动到 contentView 的右手端,我希望NSScrollView“锁定”到 contentView 的右手端(即跟踪它),并且我希望在用户(并且只有滚动)时释放“锁定” ) 从右手端滚动。

我最接近这个工作的方法是观察NSViewBoundsDidChangeNotification并更改“锁定”变量,如下所示:

- (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每当边界发生变化时都会发送 an ,因此当contentView增加的边界时,会NSScroller减少它floatValue并调用我的观察方法。即使我将NSScroller'设置为 1.0,当第一个的超过 的时floatValue,它也会重置为 0.0 。因此,我不知道是因为用户滚动还是因为变宽而发送的。bounds.size.widthcontentViewbounds.size.widthNSScrollViewNSViewBoundsDidChangeNotificationcontentView

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

我错过了一种更简单的方法吗?似乎我应该能够做到这一点,因为文件一直都在这样做?我对子类化的担忧是否NSScroller有效?

4

0 回答 0