/
HorizontalScrollView.swift
43 lines (36 loc) · 1.7 KB
/
HorizontalScrollView.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import Foundation
import Cocoa
// MARK: - HorizontalScrollView
// This NSScrollView subclass remaps Vertical Scroll events into Horizontal Scroll events, in order to
// support ScrollWheel events performed with a mouse (single axis device!).
//
class HorizontalScrollView: NSScrollView {
override func scrollWheel(with event: NSEvent) {
/// Whenever the scroll event happens on the Y axis, we'll generate a new Scroll Event, instead, and we'll remap the deltaY.
/// Why: we need to support Scroll Wheel events, performed with a mouse (with a single axis).
///
guard (abs(event.deltaX) <= abs(event.deltaY)), let cgEvent = event.cgEvent?.copy() else {
super.scrollWheel(with: event)
return
}
cgEvent.setIntegerValueField(.scrollWheelEventDeltaAxis2, value: Int64(event.deltaY))
guard let darkEvent: NSEvent = NSEvent(cgEvent: cgEvent) else {
super.scrollWheel(with: event)
return
}
super.scrollWheel(with: darkEvent)
}
/// Notes:
/// 1. Since we're overriding `scrollWheel:` we must set the `horizontalScroller.hidden = NO`. Otherwise scrolling won't work.
/// 2. In this override we're making sure the NSScroller does not affect layout!
///
/// References:
/// https://developer.apple.com/reference/appkit/nsview#//apple_ref/occ/clm/NSView/isCompatibleWithResponsiveScrolling
/// https://stackoverflow.com/questions/31186430/scrolling-in-nsscrollview-stops-when-overwriting-scrollwheel-function
///
override func tile() {
super.tile()
contentView.frame = bounds
horizontalScroller?.isHidden = true
}
}