我正在对NSScroller进行子类化,以使其看起来与“滚动条”在iOS上的外观类似。我希望它只是一个叠加,表示当前位置被绘制在其下面。无论出于何种原因,如果我覆盖了滚动条的drawRect,我会得到填充白色的边界。有没有办法防止这种情况,这样我就可以在我的NSScroller子类的基础上进行绘制了?
编辑: 用清晰的颜色绘图似乎让我很接近,但它画的“太清晰了”:当我只是想要拉到窗口时,它正在向桌面绘图。这张照片可能会更清楚
有什么想法吗?
答案 0 :(得分: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:方法(信息来自apple的文档:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSScroller_Class/Reference/Reference.html)
答案 1 :(得分:4)
如果你把所有东西都拿出来除了画出旋钮,你就可以得到一个无背景的卷轴......
- (void) drawRect: (NSRect) dirtyRect
{
[self drawKnob];
}
答案 2 :(得分:4)
或者,您可以使用RFOverlayScrollView,NSScroller的一个很好的子类,它既透明又自动隐藏;并在MIT License下发布。
RFOverlayScrollView是一个NSScrollView子类,即使连接了鼠标,也会以iOS风格显示其NSScroller。
答案 3 :(得分:0)
如果您只想绘制基类绘制的内容,请在执行自己的绘图之前调用[super drawRect:rect]
。
FWIW,我不确定你会在NSScroller的默认绘图之上绘制你想要的效果。 iOS风格的滚动条是半透明的。如果你打电话给超级drawRect:
,你将获得通过透明iOS风格的滚动条可见的蓝色滚动条。你可能想避免调用超级,只是自己画一切。
如果你想重用NSScroller所做的绘图,那么该类提供了许多方法,例如drawKnob
和drawArrow:highlight:
等。
答案 4 :(得分:0)
您需要做的就是将 scrollerView scrollerStyle
设置为 NSScrollerStyleOverlay
。