1

この問題をテストするために、NSScrollView内にIKImageBrowserViewが埋め込まれています。これは、IKImageBrowserViewがNSScrollViewの幅の半分しか埋めないためです。

私のNSScrollViewサブクラスは、次のメソッドを実装し、scrollviewでスクロールが開始および終了したときにログに記録します。

- (void)scrollWheel:(NSEvent *)event {
    switch (event.phase) {
        case NSEventPhaseBegan:
            NSLog(@"NSEventPhaseBegan");
            break;
        case NSEventPhaseEnded:
            NSLog(@"NSEventPhaseEnded");
            break;
    }

    [super scrollWheel:event];
}

NSEventPhaseBeganイベントフェーズは、スクロールを開始したときにカーソルがIKImageBrowserView上にあるかどうかを正常に呼び出します。これは予想される動作です。

ただし、スクロールを停止したときにカーソルがIKImageBrowserViewの上にある場合、NSEventPhaseEndedイベントフェーズは呼び出されません。カーソルがIKImageBrowserViewの上にない場合、NSEventPhaseEndedが呼び出されます。

IKImageBrowserViewがNSScrollViewでNSEventPhaseEndedが呼び出されないようにするのはなぜですか?

4

1 に答える 1

2

この振る舞いは実際にはバグだと私に言ったAppleの親切なエンジニアに話を聞いた。残念ながら、ImageKitはいくつかのscrollWheelイベントを食べています。回避策として、IKImageBrowserViewをサブクラス化し、scrollWheelを実装して、イベントを「スーパー」とそれを囲むスクロールビューの両方に転送します。

@implementation MyImageBrowserView

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

   if ([theEvent phase] == NSEventPhaseEnded) 
       [[self enclosingScrollView] scrollWheel:theEvent];
   }
}

@end
于 2012-08-01T20:15:09.577 に答える