Objective c NSScrollView:使用CMD+;与保留响应滚动的滚动交互

Objective c NSScrollView:使用CMD+;与保留响应滚动的滚动交互,objective-c,cocoa,appkit,nsscrollview,nsevent,Objective C,Cocoa,Appkit,Nsscrollview,Nsevent,在Mavericks中,苹果在NSScrollView中引入了响应式滚动架构。此功能添加了一种生成Overdwaws的智能方法,并将来自主事件循环的传入scroll事件的处理解耦到一个单独的循环中。详细描述了该主题 由于事件模型不同,滚动事件不再通过滚轮(with:)方法。事实上,如果您在NSScrollView子类中重写此方法,您将完全退出响应滚动架构,并退回到旧模型 在我的NSScrollView中,我想在按住命令键的同时使用滚动来实现放大的交互。这可以在MindNode或OmniGraff

在Mavericks中,苹果在
NSScrollView
中引入了响应式滚动架构。此功能添加了一种生成Overdwaws的智能方法,并将来自主事件循环的传入scroll事件的处理解耦到一个单独的循环中。详细描述了该主题

由于事件模型不同,滚动事件不再通过
滚轮(with:)
方法。事实上,如果您在
NSScrollView
子类中重写此方法,您将完全退出响应滚动架构,并退回到旧模型

在我的
NSScrollView
中,我想在按住命令键的同时使用滚动来实现放大的交互。这可以在MindNode或OmniGraffle应用程序中观察到。执行此操作的标准方法是覆盖
滚轮(使用:)
并检查每个滚动事件上的
修改标签。如上所述,这将导致选择退出响应滚动模型

我想知道是否有一种方法可以实现这种交互,同时保留响应滚动


我已经取得/尝试的成果:

  • 在我的
    NSScrollView
    子类中,我已用:)
覆盖了
滚轮,并从静态属性
isCompatibleWithResponsiveScrolling
返回
true
,以强制参与响应滚动
  • 这样我就可以检查第一个滚动事件中的修改器标志。如果未按下命令键,我只需将事件传递给
    super
    ,然后让
    NSScrollView
    执行它的操作。如果按下命令键,我会选择另一条路线并跟踪窗口上的下一个滚动事件以进行放大
  • 问题是当其中一个跟踪循环运行时,用户更改命令键的按下状态(按下或释放)
  • 从放大到滚动(在命令键释放时)的切换很简单,因为跟踪循环完全在我的控制之下
  • 从滚动到放大(按命令键)的切换更复杂,因为我无法检查滚动事件。我已经覆盖了flagsChanged(with:)
  • ,可以观察这一时刻何时发生,但我还没有找到结束滚动的方法。询问是否结束/禁用滚动,但尚未回答
      我将在这里而不是在评论中回答,因为我有更多的数据

      “响应滚动”有两个问题:

      (1) 几年前,有一个bug——加速响应滚动与传统滚动的区别。我所说的加速是指,无论手指在触摸板上移动多少次,文档都会移动的距离——传统的滚动并没有移动文档那么多,所以感觉很慢。我报告了这一点,它似乎已经在10.14修复,至少

      ⑵ 从我的研究和与苹果人的交谈中,我几乎可以看出,“响应式滚动”旨在使滚动更一致,即使应用程序占用主线程(通常会阻止事件流)-它在后台线程上处理滚轮事件,然后向主线程发送消息。因为这仍然涉及到每个滚动事件(或合并滚动事件)调用主线程,所以我不清楚在什么情况下这是一个胜利。可能有一些额外的魔力,scrollview将从实现可选缓存内容的缓存内容中提取更多文档

      在我的应用程序中,我实际上使用了一个虚拟(透明)文档的scrollview,我获取它的滚动事件并在SceneKit摄像头周围移动。由于我的场景在滚动时会发生显著变化,因此尝试在可见矩形之外进行预渲染没有任何好处


      因此,在我的例子中,我再也看不到响应式滚动和传统滚动之间的任何性能差异(尽管我在提交bug时也发现了)。

      我正在+1这一点-我最终放弃了响应式滚动,并确保处理好“动量”特别是滚动轮事件,如果用户在中间的键上松动,滚动的动量不会流过动量放大。@ WilShipley感谢+1IN。你正在开发什么样的应用程序?我严重依赖于在图()中的滚动视图中绘制画布视图,我担心放弃响应滚动会影响性能。这在你的情况下是显而易见的吗?谢谢你的进一步研究,威尔。现在你已经像MindNode的同事一样关闭了响应滚动,我也决定尝试禁用它,以使我的开发生活更轻松。但是表演受到了很大的影响,感觉非常迟钝,可能是因为我在画画。启用它会使滚动黄油再次平滑(正如Craig Federighi所宣传的那样),因此我正在寻找解决此问题的新方法。我填写了表格,我的一位朋友将带着此问题前往WWDC实验室,并询问苹果工程师。我需要的基本上是一种方法,强制响应滚动跟踪循环以编程方式结束。。。