更新:
我添加了一个用于测试的示例项目,请参阅帖子底部。
原始问题:
我有一个 NSWindow
,我会在其他一些参数发生变化时更改它的背景。
窗口背景是我通过覆盖窗口 View 子类中的 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
在 awakeFromNib
中都设置为 drawsBackground = false
,在 IB 中设置为 borderless
。
我在这里没有使用 NSAttributedString
,只是更改了 NSTextFields 的 stringValue
,当然还有它们的 textColor
。
一切正常...除了有时,文本字段有意想不到的微暗半透明背景。
(在某些屏幕上很难看到,但它确实存在。)
问题:为什么会出现这个较暗的背景?
当然:我能做些什么来修复它?
我很确定是渐变破坏了某些东西,但我找不到什么...
注意:该项目是在 Swift 中,但我可以阅读 Objective-C 答案。
编辑:
所以确实它似乎来自后面的渐变,请看测试窗口中的另一个屏幕截图。这次渐变是在 NSTextView 下的自定义 View 中绘制的,并且发生了同样的不良效果:部分文本字段背景可见但不可见。
更新:
我在一个项目中做了一个非常简单的例子来测试,用渐变来更直观地显示现象。只有一个窗口、我的渐变类和一个文本字段。您可以在 this ZIP file. 中获得(仅限 30ko)
最佳答案
您总是在脏矩形中绘制渐变。当文本更改时,该矩形只是文本字段的大小,而不是整个 View 的大小。然后,您的 drawRect 函数会在文本字段的背景矩形中绘制完整的渐变,而不仅仅是您通过文本字段看到的背景 View 范围内的渐变部分。
如果您使用 View 的框架重绘,并忽略脏矩形参数,您应该获得所需的外观。
关于cocoa - 意外的 NSTextField 背景颜色,应该是透明的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29868429/