cocoa - NSEventPhaseEnded 未在带有 IKImageBrowserView 的 NSScrollView 上调用

标签 cocoa appkit nsscrollview nsevent ikimagebrowserview

我在 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];
}

当您开始滚动时,无论光标是否位于 IKImageBrowserView 上,NSEventPhaseBegan 事件阶段都会成功调用。这是预期的行为。

但是当停止滚动时光标位于 IKImageBrowserView 上时,不会调用 NSEventPhaseEnded 事件阶段。如果光标不在 IKImageBrowserView 上,则 NSEventPhaseEnded 会被调用。

为什么 IKImageBrowserView 阻止在我的 NSScrollView 上调用 NSEventPhaseEnded?

最佳答案

与 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

关于cocoa - NSEventPhaseEnded 未在带有 IKImageBrowserView 的 NSScrollView 上调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11378323/

相关文章:

objective-c - 同步两个 NSScrollView

objective-c - 发送 'self' 到对象

swift - MouseMoved 函数从未被调用

cocoa - NSLevelIndicator - cocoa

objective-c - NSMenuItem 的值与 BOOL 绑定(bind)

objective-c - Cocoa:区分输入设备/scrollWheel:作为鼠标滚轮和触控板

cocoa - 在 NSScrollView 中展开 documentView

objective-c - 如何删除核心数据持久存储

cocoa - 无法将 "path"转换为 real 类型

objective-c - 相当于Cocoa中的UIScrollViewDelegate?