如何在NSTextView的NSScrollView滚动条上禁用鼠标悬停扩展效果?

时间:2013-05-09 20:39:02

标签: objective-c macos cocoa nsscrollview nsscroller

我有一个NSTextView,这里是滚动条的正常大小:
enter image description here
这就是当我将文本视图的滚动条悬停时发生的情况:
enter image description here
但是,我不希望这种“扩展”效应。我该如何删除它?我试图搜索如何执行此操作,但我找不到任何东西。我只想拥有常规卷轴尺寸(更薄的尺寸),即使用户将其悬停。这可能吗?
感谢

2 个答案:

答案 0 :(得分:2)

我建议继承NSScroller并覆盖– drawArrow:highlight: / – drawKnobSlotInRect:highlight: / – drawKnob方法,以便您拥有稳定的滚动条外观。

P.S。不要忘记在XIB文件中为滚动条设置新的滚动条类。

<强>更新

以下是示例代码:

- (void)drawKnob
{
    // call the default implementation for Overlay Scrollers
    if (self.scrollerStyle == NSScrollerStyleOverlay)
    {
        [super drawKnob];
        return;
    }

    if (_style == NSScrollerKnobStyleLight || _style == NSScrollerKnobStyleDefault)
            [[NSColor colorWithCalibratedWhite:1.0 alpha:0.8] setFill];
    else [[NSColor colorWithCalibratedWhite:0 alpha:0.4] setFill];

    // Note: you can specify the rect with fixed width here
    NSRect knobRect = [self rectForPart:NSScrollerKnob];

    // VERTICAL SCROLLER
    NSInteger fullWidth = knobRect.size.width;
    knobRect.size.width = round(knobRect.size.width/2);
    knobRect.origin.x += (NSInteger)((fullWidth - knobRect.size.width)/2);

    // draw...
    NSBezierPath * thePath = [NSBezierPath bezierPath];

    [thePath appendBezierPathWithRoundedRect:knobRect xRadius:4 yRadius:4];
    [thePath fill];
}

//---------------------------------------------------------------

- (void)drawKnobSlotInRect:(NSRect)slotRect highlight:(BOOL)flag
{
    // call the default implementation for Overlay Scrollers
    // draw nothing for usual
    if (self.scrollerStyle == NSScrollerStyleOverlay)
    {
        [super drawKnobSlotInRect:slotRect highlight:flag];
    }
}

//---------------------------------------------------------------

- (void)drawArrow:(NSScrollerArrow)whichArrow highlight:(BOOL)flag
{   
    // call the default implementation for Overlay Scrollers
    // draw nothing for usual
    if (self.scrollerStyle == NSScrollerStyleOverlay)
    {
        [super drawArrow:whichArrow highlight:flag];
    }
}

答案 1 :(得分:0)

我不知道你想要什么样的风格,但这个类别可能对你有帮助。

@implementation NSScrollView (SetScrollStyle)

- (void) setHidingScroll
{
    [self setScrollerStyle:NSScrollerStyleOverlay];
    [[self verticalScroller] setControlSize: NSSmallControlSize];
    [[self verticalScroller] setKnobStyle:NSScrollerKnobStyleDark];
    [self setScrollerKnobStyle:NSScrollerKnobStyleDark];
    [[self verticalScroller] setScrollerStyle:NSScrollerStyleOverlay];
}

和用法

[scrollView setHidingScroll];