意外的 NSTextField 背景颜色,应该是透明的

Unexpected NSTextField background color, should be transparent

更新:

我已经添加了一个示例项目用于测试,请参阅 post 的底部。

原问题:

我有一个 NSWindow,我会在其他一些参数发生变化时更改它的背景。

window 背景是我通过覆盖 window 视图的子 class 中的 drawRect 绘制的渐变色。

class MainWindowView: NSView {
    override func drawRect(dirtyRect: NSRect) {
        var rect = dirtyRect
        let gradient = NSGradient(startingColor: backgroundColor, endingColor: darkerBackgroundColor)
        gradient.drawInRect(rect, relativeCenterPosition: NSPoint(x: 0, y: 0))
        super.drawRect(rect)
    }
}

我在这个 window 上有两个 NSTextField

NSTextFieldawakeFromNib中设置为drawsBackground = false,在IB中设置为borderless

我在这里没有使用 NSAttributedString,只是更改了 NSTextFields 的 stringValue,当然还有它们的 textColor.

一切正常...除了有时,文本字段有一个意想不到的稍微深色的半透明背景。

(在某些屏幕上很难看到,但确实存在。)

问:为什么会出现这个较暗的背景?

当然:我能做些什么来解决它?

我很确定是渐变破坏了某些东西,但我找不到什么...

注意:项目在 Swift 但我可以阅读 Objective-C 答案。

编辑:

所以它确实似乎来自后面的渐变,请参阅测试 window 的另一个屏幕截图。这次渐变是在 NSTextView 下的自定义视图中绘制的,并且发生了同样的不良效果:部分文本字段背景可见但不应该。

更新:

我在一个项目中做了一个非常简单的例子来测试,用渐变来更直观地表现现象。只有一个 window、我的渐变 class 和一个文本字段。您可以在 this ZIP file.

中获得(仅限 30ko)

我猜您的文本字段没有分层支持。如果没有,请至少为文本字段打开图层(在 IB 中或通过 -wantsLayer 用于代码中的视图)。如果单独这样做不起作用,请尝试为渐变托管视图打开图层。

你总是在脏矩形中绘制渐变。当文本更改时,该矩形只是文本字段的大小,而不是整个视图的大小。然后,您的 drawRect 函数会在文本字段的背景矩形中绘制完整的渐变,而不仅仅是您通过文本字段看到的背景视图范围内的渐变部分。

如果您使用视图的框架重绘并忽略脏矩形参数,您应该会得到想要的外观。