7

有没有办法将 NSScroller 覆盖滚动视图的内容上(就像在 iOS 中一样)?我已经尝试了几种方法:

a)设置滚动视图内容视图 (NSClipView) 的框架以延伸到滚动条的边界

b)添加一个 NSScroller 对象作为滚动视图的子视图(位于我想要的位置)

c)创建一个完全自定义的滚动视图并将其放置为子视图(这可行,但这意味着我需要重写 NSScroller 的所有功能)

Sparrow似乎成功地做到了这一点,而且它似乎是通过一个常规的 NSScroller 子类来做到的(因为它响应了在 System Preferences >> Appearance 中设置的滚动设置)。问题并不是真正绘制滚动条,它只是让它覆盖内容。

任何建议表示赞赏:-)

4

3 回答 3

7

您可以在此处设置滚动条的自定义类。

之后,通过覆盖 的 -tile方法NSScrollView,您将正确放置它们。

于 2010-11-21T11:30:21.873 回答
4

这是我的解决方案:创建一个扩展 NSScroller 的 MyScroller 类

在 MyScroller.m 中:

#import "MyScroller.h"


@implementation MyScroller

+(CGFloat) scrollerWidth{
    return 10;
}

+(CGFloat) scrollerWidthForControlSize:(NSControlSize)controlSize{
    return 10;
}

- (void) drawBackground:(NSRect) rect{
    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:0 yRadius:0];
    [[NSColor whiteColor] set];
    [path fill];
}

- (void)drawKnob{
    [self drawBackground:[self rectForPart:0]];
    [self drawBackground:[self rectForPart:1]];
    [self drawBackground:[self rectForPart:2]];
    [self drawBackground:[self rectForPart:4]];
    [self drawBackground:[self rectForPart:5]];
    [self drawBackground:[self rectForPart:6]];


    NSRect knobRect = [self rectForPart:NSScrollerKnob];
    NSRect newRect = NSMakeRect((knobRect.size.width - [MyScroller scrollerWidth]) / 2, knobRect.origin.y, [MyScroller scrollerWidth], knobRect.size.height);
    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:newRect xRadius:5 yRadius:5];
    [[NSColor grayColor] set];
    [path fill];
}
@end

然后只需在 Interface Builder 中为 Scroller 设置自定义类。

于 2011-02-18T10:57:26.373 回答
0

我最近发布了 RFOverlayScrollView 应该可以解决您的问题:

来源:https ://github.com/rheinfabrik/RFOverlayScrollView

博文:http: //blog.rheinfabrik.de/blog/2013/01/01/introducing-rfoverlayscrollview/

于 2013-01-07T08:50:14.083 回答