如何创建对角滚动的滚轮事件?

How to create a scroll wheel event that scrolls diagonally?

文档对此非常吝啬,但根据我在网上收集的信息,wheelCount 对于 Y-only 应该是 1,对于 Y-X 应该是 2,对于 Y-X-Z 应该是 3。

据我了解,在 CGEventCreateScrollWheelEvent 中设置 wheelCount = 2 应该将 x 和 y 都滚动 10 个像素,但下一段代码在某些应用程序(Chrome、Safari)中只滚动 10 个像素在其他应用程序(Preview、Firefox)中向上滚动两个轴:

    CGEventRef scroll = CGEventCreateScrollWheelEvent(NULL,
                                                  kCGScrollEventUnitPixel,
                                                  (uint32_t)2,(int32_t)10,
                                                  (int32_t)10);
    CGEventPost(kCGHIDEventTap, scroll);

    // Verify deltas

    int64_t deltaAxis1 = CGEventGetIntegerValueField(scroll, kCGScrollWheelEventPointDeltaAxis1);
    int64_t deltaAxis2 = CGEventGetIntegerValueField(scroll, kCGScrollWheelEventPointDeltaAxis2);

    NSLog(@"kCGScrollWheelEventPointDeltaAxis1: %lld",deltaAxis1); //kCGScrollWheelEventPointDeltaAxis1: 10
    NSLog(@"kCGScrollWheelEventPointDeltaAxis2: %lld",deltaAxis2); //kCGScrollWheelEventPointDeltaAxis2: 10

    CFRelease(scroll);

Link to docs

更新: 经过一番挖掘,似乎有些应用不知道如何解释多轮滚动,只能滚动 x 或 y。

这可以使用上面的代码或 Macbook 触控板轻松重现:

在预览和 Safari 中打开放大的图片。 在预览中在触控板上对角滑动 2 个手指将创建一个漂亮的平滑 x&y 滚动。在 Safari 或 Chrome 中做同样的事情将导致只有 X 或 Y 被滚动并且一般会感觉破碎。

我发现了一个与此相关的 Chrome bug,它已被 "Won't fix" 关闭。不明白为什么。

如果能更好地解释为什么会发生这种情况,那就太好了。

谢谢

usesPredominantAxisScrolling现象描述:

Some content is scrollable in both the horizontal and vertical axes, but is predominantly scrolled one axis at a time. Other content (such as a drawing canvas) should scroll freely in both axes.

Traditionally this is not an issue with scroll wheels since they can only scroll in one direction at a time. With scroll balls and touch surfaces, it becomes more difficult to determine the user's intention.

This property helps a scroll view determine the user's intention by specifying if there is a predominant scrolling axis for content.

在带有 WebView 的测试应用中,滚动视图的 usesPredominantAxisScrolling 为 YES。将其设置为 NO 可解决问题。