1

NSScrollViewがユーザー入力によってスクロールされ、ユーザー入力のみによってスクロールされたことを検出する方法を知っている人はいますか)?

私がこれをしたい理由は、NSScrollViewcontentViewを継続的に増やしている があるからです。NSScrollViewユーザーが contentView の右端までスクロールした場合に 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ただし、境界が変更されるたびに が送信されるため、これは適切ではありませんでした。したがって、境界がcontentView増加すると、それがNSScroller減少しfloatValue、私の観測メソッドが呼び出されます。を 1.0に設定しても、最初NSScrollerのが を超えるとfloatValue0.0 にリセットされます。したがって、ユーザーがスクロールしたために送信されたのか、それとも幅が広がったために送信されたのかはわかりません。bounds.size.widthcontentViewbounds.size.widthNSScrollViewNSViewBoundsDidChangeNotificationcontentView

ユーザー入力を追跡し、ロック変数を更新するために、 andメソッドをサブクラスNSScroller化して使用することを検討しました。ただし、ユーザーがトラックパッドをスワイプしてスクロールすると、これらのメソッドが呼び出されないことが懸念されます。おそらく根拠がないと思われるもう 1 つの小さな懸念は、<->関係が壊れる可能性があり、多くのスクロール機能を再実装する必要があるということです。mouseDown:mouseDragged:NSScrollViewNSScroller

これを行う簡単な方法を見逃しましたか?ドキュメントは常にそれを行うので、私はこれを行うことができるはずですか?サブクラス化に関する私の懸念はNSScroller有効ですか?

4

0 に答える 0