When scrolling a basic NSScrollView there seems to be a sudden jump after each flick. Scrolling does not appear smooth and is disorientating.
A scroll jump seems to happen directly after letting go of a scroll flick using a trackpad/mouse. Right at that moment the scroll turns into a momentum scroll, slowly decreasing the speed. But the first frame after the gesture the content jumps forward, more than what is expected.
Observations:
- Counterintuitively, scrolling appears to be smoother when disabling
NSScrollView.isCompatibleWithResponsiveScrolling
. If disabled using a customNSScrollView
subclass there is no large jump anymore. - Scrolling also appears to be smoother using a
SwiftUI ScrollView
. I assume that has the same behaviour as a disabledisCompatibleWithResponsiveScrolling
- Ironically a
WKWebView
scrolls much smoother. No sudden jump is observable. It also seems to scroll with faster acceleration, but the individual frames do appear smoother. Why is this better than a nativeNSScrollView
? - Elastic scrolling at the bounds of the scroll view also appears much smoother for
WKWebViews
. When pulling to refresh there is a jump forNSScrollView/SwiftUI
, but not for WKWebView. - When using an
NSScrollView
withisCompatibleWithResponsiveScrolling
disabled, scrolling appears just as smooth asWKWebView
on macOS 13 Ventura and below. On macOS 14 Sonoma scrolling behaviour is suddenly different.
Please see a sample project with 4 different scroll views side by side: https://github.com/floorish/ScrollTest Screen recordings show the sudden jumps when scrolling and when elastic scrolling. Tested on Intel & Arm Macs, macOS 11 Big Sur through 15 Sequoia, built with Xcode 16.
Should isCompatibleWithResponsiveScrolling
be disabled on Sonoma+? Are there any drawbacks?
There is also no overdraw anymore since Monterey, as described in https://developer.apple.com/library/archive/releasenotes/AppKit/RN-AppKitOlderNotes/#10_9Scrolling
Even with responsive scrolling disabled, why is WKWebView
scrolling much smoother than NSScrollView
?