In a MacOS application being written in Swift, I have a vanilla, sub-classed NSScrollView
that allows magnification. The documentView
it presents is not very wide and completely fits horizontally within the bounds of the NSScrollView
's display area. But the document is very long, and so it scrolls vertically.
When I pan slowly using a two-finger gesture on my trackpad, the NSScrollView
prevents any horizontal movement (other than a little springiness). Panning vertically also works as expected.
When I pan vertically hard (with a little flick to it) and let go, the scrolling in that direction continues for a little while with virtual momentum, then slows down and stops. Again, all seems correct.
Sometimes, though, scrolling jerks to an immediate stop, based on some difference (I presume) in how Apple's internal (default) NSPanGestureRecognizer
analyzes the movement. The jerking to a stop is unwanted and frustrating. It seems to only occur when the document has been zoomed out. When zoomed in, the jerking doesn't happen after a trackpad flick. So the difference likely has to do with the gesture recognizer working in the screen coordinate system, rather than the magnified coordinate system of the NSScrollView
.
The other problem is that if the pan gesture is strong, and has any diagonal direction to it (which is most of the time, since it's really hard to flick on the trackpad perfectly vertically), the automatic, continual scrolling drifts the document view right or left in that diagonal direction, even though there's no reason to and it's normally pinned horizontally. For very long continuous scrolls, the document view even drifts completely outside the visible bounds, which is kind of ridiculous. Then, when the continuous scrolling stops, the NSScrollView
instantly (without continuous scrolling) jumps the documentView
completely back into view (horizontally).
The same drifting analogously occurs when doing horizontal continuous scrolling for documents that are very wide and not very high.
This drifting during continuous scrolling after the gesture has finished occurs regardless of whether any centering constraint is in effect, a là this stackoverflow question and answer.
So ... is there a way to prevent this jerking and this drifting during continuous scrolling in an NSScrollView?