Is it possible to 'hide' the scrollers of an NSScrollView and still get gestural scrolling behavior?
5 Answers
Create an NSScroller subclass and set it as the vertical/horizontal scroller for the NSScrollView instance.
The NSScroller subclass should override this (10.7 and above):
+ (CGFloat)scrollerWidthForControlSize:(NSControlSize)controlSize scrollerStyle:(NSScrollerStyle)scrollerStyle {
return 0;
}

- 1,046
- 9
- 10
This is definitely a bug in AppKit. I was able to get this working on 10.8.5 using either of the following solutions:
1) Subclass NSScroller (preferred method)
+ (BOOL)isCompatibleWithOverlayScrollers
{
// Let this scroller sit on top of the content view, rather than next to it.
return YES;
}
- (void)setHidden:(BOOL)flag
{
// Ugly hack: make sure we are always hidden.
[super setHidden:YES];
}
Source: jmk in https://stackoverflow.com/a/12960795/836263
2) Bounce-back and momentum seems broken when using the legacy style. It also partially breaks Apple's scroll synchronization code. It causes the scroll views to reset scroll position if one is NSScrollerStyleOverlay
and the other is NSScrollerStyleLegacy
. If the overlay-style scroll view is scrolled, then the legacy style is scrolled, it resets both scroll views to the top y=0 scroll offset.
[self.scrollView setHasVerticalScroller:YES];
[self.scrollView setScrollerStyle:NSScrollerStyleLegacy];
[self.scrollView setHasVerticalScroller:NO];
Yes, it is possible. Try this soon after initializing the scrollView.
self.scrollView.wantsLayer = YES;
I've gotten this to work without hiding an NSScroller
subclass and without touching setHasVerticalScroller:
. Also, if self.scrollView
is a subclass that overrides drawRect:
, try turning that off to make sure that what you're doing there isn't causing the problem.

- 2,206
- 1
- 16
- 16
Causes the scrollview to not display a scroller and not respond to gestural scrolling:
-setHasHorizontalScroller:NO
Causes a disabled scroller to be displayed, but it responds to gestural scrolling:
-setHasHorizontalScroller:YES
-setHidden:YES
-
I think maybe you mean "YES causes a disabled scroller **NOT** to be displayed, but it responds to gestural scrolling", no? – Alex Gray Apr 21 '12 at 18:38
Why don't you just try it?
To answer the question: Yes, if the user has mouse with a scroll wheel or a a scrolling-capable touchpad, it is still possible to scroll the view, despite the scrollers being invisible.

- 53,243
- 5
- 129
- 141
-
3Not sure what I'm doing wrong. I can scroll with my trackpad when setHasHorizontalScroller:YES, but not if setHasHorizontalScroller:NO. – NuBee May 17 '11 at 18:26