覆盖内容的NSScroller

时间:2010-11-21 02:55:48

标签: objective-c cocoa nsview nsscrollview nsscroller

有没有办法将NSScroller 叠加在滚动视图的内容上(如在iOS中)?我已经尝试了几种方法:

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

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

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

Sparrow似乎成功地执行了此操作,并且它似乎通过常规NSScroller子类来执行此操作(因为它响应系统首选项>>外观中设置的滚动设置)。这并不是真正吸引滚动条的问题,只是让它覆盖了内容。

感谢任何建议: - )

2 个答案:

答案 0 :(得分:7)

Here's where you can set the custom class of your scrollbars.

之后,通过覆盖-tile的{​​{1}}方法,您可以正确放置它们。

答案 1 :(得分: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设置自定义类。