Last active
July 31, 2020 21:58
-
-
Save zrzka/3316be23624400f349ecc1de0a8d139d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ClipView: NSClipView { | |
var isScrollAnimationEnabled: Bool = true | |
override func scroll(to newOrigin: NSPoint) { | |
if isScrollAnimationEnabled { | |
super.scroll(to: newOrigin) | |
} else { | |
setBoundsOrigin(newOrigin) | |
} | |
} | |
} | |
class OutlineView: NSOutlineView { | |
private var arrowKeysDown = Set<UInt16>() | |
override func keyDown(with event: NSEvent) { | |
if (125...126).contains(event.keyCode) { | |
arrowKeysDown.insert(event.keyCode) | |
(enclosingScrollView?.contentView as? ClipView)?.isScrollAnimationEnabled = false | |
} | |
super.keyDown(with: event) | |
} | |
override func keyUp(with event: NSEvent) { | |
super.keyUp(with: event) | |
arrowKeysDown.remove(event.keyCode) | |
(enclosingScrollView?.contentView as? ClipView)?.isScrollAnimationEnabled = arrowKeysDown.isEmpty | |
} | |
} |
Did update the gist. We can set it to false
explicitly in the keyDown
, but we have to keep it in the keyUp
to be sure that both Up / Down arrow keys are released.
I see, thanks. In practice I wasn't able to re-enable the scrolling animation with the scenario you described, as the down arrow keeps calling key down, which immediately disables it again. But it sure is best practice to not rely on that.
Yeah, you're probably right, feel free to modify it in any way :)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@tesch
First - You'd like to disable/enable scrolling only when Up / Down arrow keys are pressed / released.
Second - imagine this:
Sometimes, especially on non full sized keyboards, I press both Up & Down arrow keys down, realize this, move my finger a bit and one key is released then (up), but another one is still down. In this case, you do not want to enable scrolling again until you release both of them, because the table/outline view is still scrolling.
It's an edge case, but can happen.