我将 NSScroller 子类化以尝试使其看起来类似于“滚动条”在 iOS 上的外观。我希望它只是一个覆盖层,代表在其下方绘制的当前位置。无论出于何种原因,如果我为滚动条覆盖 drawRect,我的边界都会被白色填充。有什么办法可以防止这种情况发生,这样我就可以在我的 NSScroller 子类结束的基础上进行绘制?
编辑:用清晰的颜色绘图似乎让我很接近,但它正在绘制“太清晰”:P 当我只想绘制到窗口时,它正在绘制到桌面。这张图可能更清楚
有任何想法吗?
我将 NSScroller 子类化以尝试使其看起来类似于“滚动条”在 iOS 上的外观。我希望它只是一个覆盖层,代表在其下方绘制的当前位置。无论出于何种原因,如果我为滚动条覆盖 drawRect,我的边界都会被白色填充。有什么办法可以防止这种情况发生,这样我就可以在我的 NSScroller 子类结束的基础上进行绘制?
编辑:用清晰的颜色绘图似乎让我很接近,但它正在绘制“太清晰”:P 当我只想绘制到窗口时,它正在绘制到桌面。这张图可能更清楚
有任何想法吗?
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)
如果你把所有东西都放在一边,只画旋钮,你可以得到一个无背景的滚动条......
- (void) drawRect: (NSRect) dirtyRect
{
[self drawKnob];
}
或者,您可以使用RFOverlayScrollView,它是 NSScroller 的一个很好的子类,它既透明又自动隐藏;并在MIT 许可下发布。
RFOverlayScrollView 是一个 NSScrollView 子类,即使连接了鼠标,它也会以 iOS 样式显示其 NSScroller。
您需要做的就是将 scrollerView 设置scrollerStyle
为NSScrollerStyleOverlay
.
如果您只想在基类绘制的内容之上进行绘制,请[super drawRect:rect]
在进行自己的绘制之前调用。
FWIW,我不确定您是否会通过在 NSScroller 的默认绘图之上进行绘制来获得所需的效果。iOS 风格的滚动条是半透明的。如果您调用 super's drawRect:
,您将获得蓝色滚动条,这些滚动条将通过透明的 iOS 样式滚动条可见。您可能希望避免调用 super 并自己绘制所有内容。
如果您想重用 NSScroller 所做的绘图,该类提供了许多方法来执行此操作,例如drawKnob
、 和drawArrow:highlight:
等。