2010-11-15 59 views
3

我对NSScroller进行了子类化,试图使它看起来像iOS上的“滚动条”的外观。我希望它只是一个覆盖层,代表在当前位置上绘制的位置。无论出于何种原因,如果我重写scroller的drawRect,我会得到充满白色的边界。有没有什么办法可以防止这种情况发生,因此我可以仅仅在我的NSScroller子类的基础上进行绘制?如何绘制一个透明的NSScroller

编辑: 用清晰的颜色绘制似乎使我接近,但它画的“太清楚”:P它正在绘制到桌面,当我只是想画到窗口。这张图可能会让它更加清晰 alt text

任何想法?

回答

9

的NSView子类完成所有的图纸开始的drawRect。如果在子类中重写该方法,则需要负责完成所有绘图(无论是通过自己的方法还是调用super的方法)。例如,以下代码只绘制滚动nob,并使其余部分滚动条的框架是透明的。

- (void)drawRect:(NSRect)dirtyRect { 

    // Do some custom drawing... 
    [[NSColor clearColor] set]; 
    NSRectFill(dirtyRect); 

    // Call NSScroller's drawKnob method (or your own if you overrode it) 
    [self drawKnob]; 
    } 

这是一个比一个实际的代码的建议(不知道是什么含义这样做少量的图纸对NSScroller)NSScroller也有其他具体的绘制方法可以覆盖从/调用更多概念证明的一个重写的drawRect:方法(可从信息苹果的文档:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSScroller_Class/Reference/Reference.html

+0

这让我非常接近我正在寻找,但会“过犹不及”。看到我上面的编辑(图片是与绘制旋钮注释帮助说明)。 – BarrettJ 2010-11-16 05:10:10

+0

找到我需要的颜色:[NSColor colorWithCalibratedWhite:0.13 alpha:0.855] – BarrettJ 2010-11-16 05:27:40

+0

谢谢。它有帮助。 :) – Sid 2014-01-10 09:55:54

0

如果您只是想绘制基类绘制的内容,请在执行自己的绘制之前调用[super drawRect:rect]

FWIW,我不确定你会通过在NSScroller的默认绘图上绘制来获得想要的效果。 iOS风格的滚动条是半透明的。如果你打电话给超级的drawRect:,你会看到蓝色的滚动条,透过iOS风格的透明滚动条可以看到。你可能想要避免调用超级并且只是自己画一切。

如果你想重用绘制NSScroller件呢,这个类提供了这样做的方法很多,如drawKnobdrawArrow:highlight:

4

如果你把所有的东西,除了绘制旋钮,你可以得到一个背景不太滚动...

- (void) drawRect: (NSRect) dirtyRect 
{ 
    [self drawKnob]; 
} 
+0

尽管这篇文章已经过了几年,但我只想提一下,这仍然适用于Swift(并且非常简单)。 – Alex 2014-07-23 13:34:36

+0

@Alex这确实有效。但是,在用户完成滚动后,这不会隐藏滚动条(即使通过触控板连接)。 – Supertecnoboff 2017-10-09 10:34:55

4

另外,您可以使用RFOverlayScrollView,这是NSScroller的一个很好的子类,它既透明又自动隐藏;并根据MIT License发布。

RFOverlayScrollView

RFOverlayScrollView是NSScrollView子类,显示其NSScroller在IOS风格即使当鼠标连接。

enter image description here

+0

这是我正在寻找的完全一样。谢谢您的帮助。你让我今天一整天都感觉很好。谢谢先生。 :) – Sid 2013-11-18 08:19:54

+0

当我发现它时,我的反应就是这样!不要忘了也要感谢作者;) – 2013-11-18 17:18:59

+0

梦幻般的课,完美的作品! (即使在macOS High Sierra - Xcode 9上)。 – Supertecnoboff 2017-10-09 10:33:48