1

我在 NSScrollView 中嵌入了一个 IKImageBrowserView,为了帮助测试这个问题,IKImageBrowserView 只填充了 NSScrollView 宽度的一半。

我的 NSScrollView 子类实现了以下方法并在滚动视图上滚动开始和结束时记录。

- (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 并将事件转发到“super”和封闭的滚动视图。

@implementation MyImageBrowserView

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

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

@end
于 2012-08-01T20:15:09.577 回答