NSEventPhaseEnded未使用IKImageBrowserView在NSScrollView上调用

时间:2012-07-07 20:16:48

标签: cocoa appkit nsscrollview nsevent ikimagebrowserview

我在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。

为什么IK​​ImageBrowserView阻止在我的NSScrollView上调用NSEventPhaseEnded?

1 个答案:

答案 0 :(得分:2)

向Apple的一位乐于助人的工程师发言,他告诉我这种行为实际上是一个错误。不幸的是,ImageKit正在吃一些scrollWheel事件。作为一种变通方法,子类化IKImageBrowserView,实现scrollWheel并将事件转发到“super”和封闭的scrollview。

@implementation MyImageBrowserView

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

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

@end