更新
我已经添加了一个示例项目进行测试,请参阅帖子的底部。
原始问题:
我有一个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
。
一切正常......除了有时,文本字段会出现意外的略微暗半透明的背景。
(在某些屏幕上很难看到,但它已经存在。)
问题:为什么会出现这种较暗的背景?
当然:我能做些什么来解决它?
我很确定渐变会破坏某些东西,但我无法找到...
注意:项目在Swift中,但我可以阅读Objective-C答案。
修改
所以确实它似乎来自后面的渐变,从测试窗口看到这个其他截图。这次在NSTextView下的自定义视图中绘制渐变,并发生相同的不良效果:文本字段背景的某些部分是可见的,但不应该。
更新
我在一个测试项目中做了一个非常简单的例子,使用渐变可以更明显地显示这种现象。只有一个窗口,我的渐变类和一个文本字段。您可以在this ZIP file.
中获取它(仅限30ko)
答案 0 :(得分:1)
您总是在脏矩形中绘制渐变。当文本改变时,该rect只是文本字段的大小,而不是整个视图的大小。然后,drawRect函数在文本域的背景rect中绘制完整渐变,而不仅仅是您在文本域中看到的背景视图宽度渐变的部分。
如果使用视图的框架重绘,并忽略脏的rect参数,则应获得所需的外观。
答案 1 :(得分:0)
我猜你的文字字段不是图层支持的。如果没有,请至少为文本字段打开图层(在IB中或通过-wantsLayer
代码中的视图)。如果仅此方法不起作用,请尝试启用渐变托管视图的图层。