如何创建对角滚动的滚轮事件?
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);
更新: 经过一番挖掘,似乎有些应用不知道如何解释多轮滚动,只能滚动 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 可解决问题。
文档对此非常吝啬,但根据我在网上收集的信息,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);
更新: 经过一番挖掘,似乎有些应用不知道如何解释多轮滚动,只能滚动 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 可解决问题。