如何绘制一个透明的 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 上)。 我唯一想补充的是,iffadeOut 方法的声明。当您连接了 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 所做的绘图片段,该类提供了很多方法来做到这一点,例如 drawKnobdrawArrow:highlight: 等。

【讨论】:

以上是关于如何绘制一个透明的 NSScroller的主要内容,如果未能解决你的问题,请参考以下文章

如何使用html5画布元素绘制透明图像

iOS7如何绘制透明的UIToolbar或UINavigationBar

如何使用drawImageRect设置绘制到画布上的图像的不透明度?

如何使用 C# 在画布上的 WPF 中绘制透明 PNG

如何使用 Raphael.js 绘制“透明笔画”

如何优化多个全屏透明 iPhone OpenGL ES 图层的绘制?