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

时间:2015-04-25 17:26:24

标签: cocoa swift gradient nswindow nstextfield

更新

我已经添加了一个示例项目进行测试,请参阅帖子的底部。

原始问题:

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

窗口背景是我通过在窗口视图的子类中覆盖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)
    }
}

我在这个窗口上有两个NSTextField

NSTextField中,drawsBackground = false都设置为awakeFromNib,在IB中设置为borderless

我在这里没有使用NSAttributedString,只更改了NSTextField的stringValue,当然还有textColor

一切正常......除了有时,文本字段会出现意外的略微暗半透明的背景。

NOT GOOD

(在某些屏幕上很难看到,但它已经存在。)

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

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

我很确定渐变会破坏某些东西,但我无法找到...

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

修改

所以确实它似乎来自后面的渐变,从测试窗口看到这个其他截图。这次在NSTextView下的自定义视图中绘制渐变,并发生相同的不良效果:文本字段背景的某些部分是可见的,但不应该。

Example 2

更新

我在一个测试项目中做了一个非常简单的例子,使用渐变可以更明显地显示这种现象。只有一个窗口,我的渐变类和一个文本字段。您可以在this ZIP file.

中获取它(仅限30ko)

example in project

2 个答案:

答案 0 :(得分:1)

您总是在脏矩形中绘制渐变。当文本改变时,该rect只是文本字段的大小,而不是整个视图的大小。然后,drawRect函数在文本域的背景rect中绘制完整渐变,而不仅仅是您在文本域中看到的背景视图宽度渐变的部分。

如果使用视图的框架重绘,并忽略脏的rect参数,则应获得所需的外观。

答案 1 :(得分:0)

我猜你的文字字段不是图层支持的。如果没有,请至少为文本字段打开图层(在IB中或通过-wantsLayer代码中的视图)。如果仅此方法不起作用,请尝试启用渐变托管视图的图层。