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

时间:2017-06-25 16:23:31

标签: objective-c macos scroll macos-sierra cgeventtap

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

根据我的理解设置CGEventCreateScrollWheelEvent内的wheelCount = 2应该将x和y滚动10个像素,但下一个代码块会滚动,在某些应用程序(Chrome,Safari)中只有10个像素,而在其他应用程序中(预览,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已被关闭"赢得修复"。无法理解原因。

对于为什么会发生这种情况的任何更好的解释都会很棒。

由于

1 个答案:

答案 0 :(得分:1)

usesPredominantAxisScrolling描述了这种现象:

  

某些内容在水平和垂直轴上都可滚动,但主要是一次滚动一个轴。其他内容(如绘图画布)应在两个轴上自由滚动。

     

传统上这不是滚轮的问题,因为它们一次只能向一个方向滚动。使用滚动球和触摸表面,确定用户的意图变得更加困难。

     

此属性通过指定内容是否存在主要滚动轴来帮助滚动视图确定用户的意图。

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