开发者

Can NSScrollView scroll if setHasHorizontalScroller:NO?

Is it possible to '开发者_StackOverflowhide' the scrollers of an NSScrollView and still get gestural scrolling behavior?


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;
}


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];


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


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.


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜