3

10.7 以降のプロジェクトで、マウスがコレクション ビュー アイテムのビューの境界内にあるときに、NSCollectionViewItem で UI 要素を有効にしようとしています。NSCollectionView に値を設定するコレクション ビュー アイテムごとに、その境界を使用して個々の NSTrackingArea を作成するカスタム ビューがあります。

- (void) initializeMouseTracking
{
    self.trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] options:NSTrackingMouseEnteredAndExited|NSTrackingActiveAlways owner:self userInfo:nil];
    [self addTrackingArea:self.trackingArea];

    NSPoint mouseLocation = [[self window] mouseLocationOutsideOfEventStream];
    mouseLocation = [self convertPoint: mouseLocation fromView: nil];

    if (NSPointInRect(mouseLocation, [self bounds]) == YES)
    {
        [self mouseEntered:nil];
    }
    else
    {
        [self mouseExited:nil];
    }
}

トラッキング エリアは、NSCollectionView コンテンツがスクロールされるまでうまく機能します。スクロール中およびスクロール後にトラッキング領域をリセットする必要があることは明らかです。いくつかの方法で NSTrackingAreas を無効にして再作成しようとしました。

- (void) resetMouseTracking
{
    [self removeTrackingArea:self.trackingArea];
    [self initializeMouseTracking];
}


- (void) scrollWheel:(NSEvent *)theEvent
{
    [self resetMouseTracking];
    [super scrollWheel:theEvent];
}


- (void) viewDidMoveToWindow:(NSWindow *)newWindow
{   
    [self resetMouseTracking];
    [super viewWillMoveToWindow:newWindow];
}


- (void) updateTrackingAreas
{
    [self resetMouseTracking];
    [super updateTrackingAreas];
}

しかし、これらの試みは不完全でバグのある結果をもたらしただけでなく、スクロール中の追跡領域の絶え間ない再計算 (ala scrollwheel:) は不要のようです。代わりに、スクロール中にすべてのトラッキング領域を無効にできるように、スクロール イベントの開始とオフセットをキャプチャする効果的な方法 (iOS で簡単に実行できます) があれば便利です。scrollview の contentView で NSViewBoundsDidChangeNotification を使用すると、スクロールが発生していることがわかりますが、いつ開始または停止するかはわかりません。

NSScrollView からスクロールの開始と終了の通知を取得するには、深いサブクラス化が必要ですか、それとも他に何か見落としがありますか? より有望な、まったく異なるアプローチがありますか?

4

2 に答える 2

0

スクロール ビューの Cocoa では、iOS とは異なり、documentView(ではなくcontentView) 上ですべてが行われます。[scrollView documentVisibleRect].originおそらくコンテンツオフセットが必要です。

UIScrollView と NSScrollView のより類似した比較については、この回答を確認してください

于 2013-07-18T19:42:22.347 に答える