【问题标题】:How to draw a transparent NSScroller如何绘制一个透明的 NSScroller
【发布时间】:2010-11-15 02:44:21
【问题描述】:

我将 NSScroller 子类化以尝试使其看起来类似于 iOS 上的“滚动条”外观。我希望它只是一个覆盖层,代表在其下方绘制的当前位置。无论出于何种原因,如果我为滚动条覆盖 drawRect,我的边界都会被白色填充。有什么办法可以防止这种情况发生,这样我就可以在我的 NSScroller 子类结束的基础上进行绘制?

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

有什么想法吗?

【问题讨论】:

    标签: objective-c cocoa nsview nsscroller


    【解决方案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: 等。

      【讨论】:

        猜你喜欢
        • 2019-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多