如何绘制一个透明的 NSScroller
Posted
技术标签:
【中文标题】如何绘制一个透明的 NSScroller【英文标题】:How to draw a transparent NSScroller 【发布时间】:2010-11-15 02:44:21 【问题描述】:我将 NSScroller 子类化以尝试使其看起来类似于 ios 上的“滚动条”外观。我希望它只是一个覆盖层,代表在其下方绘制的当前位置。无论出于何种原因,如果我为滚动条覆盖 drawRect,我的边界都会被白色填充。有什么办法可以防止这种情况发生,这样我就可以在我的 NSScroller 子类结束的基础上进行绘制?
编辑: 用清晰的颜色绘制似乎让我很接近,但它正在绘制“太清晰”:P 当我只想绘制到窗口时,它正在绘制到桌面。这张图可能更清楚
有什么想法吗?
【问题讨论】:
【参考方案1】: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)
【讨论】:
这让我非常接近我正在寻找的东西,但是“太远了”。请参阅上面的编辑(图片带有注释掉的绘图旋钮以帮助说明)。 找到我需要的颜色:[NSColor colorWithCalibratedWhite:0.13 alpha:0.855] 谢谢。它有帮助。 :)【参考方案2】:如果你把所有东西都去掉,除了画旋钮,你可以获得一个无背景的滚动条......
- (void) drawRect: (NSRect) dirtyRect
[self drawKnob];
【讨论】:
虽然这篇文章已经有几年的历史了,但我只想提一下,这仍然可以使用 Swift(而且非常简单)。 @Alex 这确实有效。但是,在用户完成滚动后,这不会隐藏滚动条(即使您是通过触控板连接的)。【参考方案3】:或者,您可以使用RFOverlayScrollView,它是 NSScroller 的一个很好的子类,它既透明又自动隐藏;并在MIT License下发布。
RFOverlayScrollView
RFOverlayScrollView 是一个 NSScrollView 子类,即使连接了鼠标,它也会以 iOS 样式显示其 NSScroller。
【讨论】:
这个和我要找的完全一样。谢谢您的帮助。你让我今天一整天都感觉很好。谢谢先生。 :) 我发现它时的反应!也别忘了感谢作者;) 很棒的课程,完美运行! (即使在 macOS High Sierra - Xcode 9 上)。 我唯一想补充的是,if
对 fadeOut
方法的声明。当您连接了 USB 鼠标时,您仍然希望在用户停止滚动后滚动条可见(或至少可见一半)。因此,在fadeOut
方法中,检查scrollerStyle
以查看您是在显示标准滚动条还是自动隐藏滚动条。然后相应地设置 alpha 值。 if (self.scrollerStyle == NSScrollerStyleLegacy) fadeOutValue = 0.4f; else fadeOutValue = 0.0f;
。这也使您能够隐藏可怕的白色背景。【参考方案4】:
您需要做的就是将scrollerView scrollerStyle
设置为NSScrollerStyleOverlay
。
【讨论】:
【参考方案5】:如果您只想在基类绘制的内容之上进行绘制,请在自己绘制之前调用[super drawRect:rect]
。
FWIW,我不确定您是否会通过在 NSScroller 的默认绘图之上进行绘制来获得所需的效果。 iOS 风格的滚动条是半透明的。如果你打电话给 super 的drawRect:
,你会得到蓝色的滚动条,通过透明的 iOS 风格的滚动条可以看到。您可能希望避免调用 super 并自己绘制所有内容。
如果你想重用 NSScroller 所做的绘图片段,该类提供了很多方法来做到这一点,例如 drawKnob
和 drawArrow:highlight:
等。
【讨论】:
以上是关于如何绘制一个透明的 NSScroller的主要内容,如果未能解决你的问题,请参考以下文章
iOS7如何绘制透明的UIToolbar或UINavigationBar