gpt4 book ai didi

objective-c - NSScrollView:使用 CMD+滚动交互进行放大,并保留响应式滚动

转载 作者:行者123 更新时间:2023-12-03 16:45:22 25 4
gpt4 key购买 nike

在 Mavericks 中,Apple 在 NSScrollView 中引入了响应式滚动架构。此功能添加了一种生成 overdraw 的智能方法,并将传入滚动事件的处理从主事件循环分离到单独的事件循环中。本主题有详细介绍in the session 215 from WWDC 2013

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

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

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

<小时/>

我已经实现/尝试过的:

  • 在我的 NSScrollView 子类中,我重写了 scrollWheel(with:) 并从静态属性 isCompatibleWithResponsiveScrolling 返回 true code> 以强制参与响应式滚动。
  • 这样我就可以检查修饰符标志的第一个滚动事件。如果未按下命令键,我只需将事件传递给 super 并让 NSScrollView 执行其操作。如果按下命令键,我会走另一条路线并跟踪窗口上的下一个滚动事件以进行放大。
  • 问题是当这些跟踪循环之一正在运行并且用户更改命令键的按下状态(按下或释放)时。
  • 从放大到滚动的切换(释放命令键)很简单,因为跟踪循环完全在我的控制之下。
  • 从滚动到放大的切换(按命令键)更加棘手,因为我无法检查滚动事件。我已经覆盖了 flagsChanged(with:) 并且可以观察这一刻发生的时间,但我还没有找到结束滚动的方法。 This SO question询问是否结束/禁用滚动,但尚未得到答复。

最佳答案

我将在这里回答,而不是在评论中回答,因为我有更多数据。

“响应式滚动”存在两个问题:

(1) 几年前存在一个错误 - 加速响应式滚动与传统滚动的方式存在差异。我所说的加速是指手指在触控板上进行任何给定的移动量时文档将移动的距离 - 传统滚动不会移动文档那么多,所以感觉很迟缓。我报告了这个问题,至少在 10.14 中似乎已修复。

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

在我的应用程序中,我实际上使用带有虚拟(透明)文档的 ScrollView ,并获取其滚动事件并在 SceneKit 相机周围移动。由于当您滚动时我的场景会发生巨大变化,因此尝试在可见矩形之外进行预渲染没有任何好处。

因此,就我而言,我不再认为响应式滚动和传统滚动之间存在任何性能差异(尽管我在提交错误时确实如此)。

关于objective-c - NSScrollView:使用 CMD+滚动交互进行放大,并保留响应式滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46785553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com