Macos 覆盖滚轮功能时,NSScrollView中的滚动停止

Macos 覆盖滚轮功能时,NSScrollView中的滚动停止,macos,swift,mouse,nsscrollview,nsevent,Macos,Swift,Mouse,Nsscrollview,Nsevent,当我覆盖NSScrollView中的scrollWheel(theEvent:NSEvent)函数时,我遇到了一个奇怪的错误 这是我的密码: import Cocoa class GraphScrollView: NSScrollView { var axisScrollViewInstance: AxisScrollView? override func scrollWheel(theEvent: NSEvent) { if theEvent.deltaY

当我覆盖NSScrollView中的scrollWheel(theEvent:NSEvent)函数时,我遇到了一个奇怪的错误

这是我的密码:

import Cocoa

class GraphScrollView: NSScrollView {
    var axisScrollViewInstance: AxisScrollView?

    override func scrollWheel(theEvent: NSEvent) {
        if theEvent.deltaY != 0 {
            axisScrollViewInstance?.scrollEventFromOtherScrollView(theEvent)
            super.scrollWheel(theEvent)
        } else if theEvent.deltaX != 0 {
            super.scrollWheel(theEvent)
        }
    }
}

class AxisScrollView: NSScrollView {
    var graphScrollViewInstance: GraphScrollView?
    override func scrollWheel(theEvent: NSEvent) {
        if theEvent.deltaY != 0 {
            super.scrollWheel(theEvent)
            graphScrollViewInstance?.scrollWheel(theEvent)
        }
    }

    func scrollEventFromOtherScrollView(theEvent: NSEvent) {
        if theEvent.deltaY != 0 {
            super.scrollWheel(theEvent)
        }
    }   
}
代码基本上检查用户滚动的方向,如果方向是垂直的,则将NSEvent转发到另一个NSScrollView。我需要这个,这样我就可以有两个相邻的NSScrollView,它们都垂直滚动,其中一个也水平滚动。例如,你可以看看Mac Calendar应用程序,它在左侧有一个小时列,只能垂直滚动,在右侧有一个星期概览,可以水平和垂直滚动

但是,如果我覆盖了scrollWheel方法并从内部调用超级函数,就会导致强大的鼠标出现奇怪的问题。我只能向上和向右滚动,而如果我向任何其他方向滚动,它不会起任何作用,尽管N事件总是发生,不管我向哪个方向滚动。一段时间后,它完全停止滚动

我已经尝试过简单地覆盖scrollWheel方法,并仅使用如下事件调用super函数:

override func scrollWheel(theEvent: NSEvent) {
    super.scrollWheel(theEvent)
}
但它也会导致同样的问题。我有第二个(非苹果)鼠标连接到我的系统,它有一个“正常”的滚轮,我的代码可以很好地运行

你知道问题出在哪里吗?我听说N事件属于不同的子类型(1:苹果设备,0:任何其他设备)。也许这与此有关?
否则,您知道如何让两个NSScrollView相邻,同时垂直滚动吗

好的,这是Xcode 6.4中的界面生成器的一个缺陷,可能在早期版本中也是如此。必须确保选中NSScrollView属性检查器中的“显示垂直滚动条”和“显示水平滚动条”框

如果选中这两个复选框,则覆盖滚轮(theEvent:NSEvent)功能不会有问题。然后,您可以通过在例如您的init()中将和设置为false,以编程方式再次删除滚动条,而不会出现问题


于2015年10月12日更新 我已经向苹果公司报告了这个“bug”,但是,通过覆盖-scrollWheel函数,视图似乎失去了它的响应滚动功能

以下是苹果开发团队的答案:

  • 如果覆盖-scrollWheel,则该scrollView无法执行响应滚动
  • 如果未启用响应滚动,则必须显示滚动条,以便滚动视图
  • 有关详细信息,请参阅文档
  • 文件中说:

    除非类重写lockFocus或scrollWheel:方法,否则此方法的默认实现将返回true


    非常感谢这个帖子@Peter。我们面临着同样的问题。