意外的 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
。
NSTextField
在awakeFromNib
中设置为drawsBackground = false
,在IB中设置为borderless
。
我在这里没有使用 NSAttributedString
,只是更改了 NSTextFields 的 stringValue
,当然还有它们的 textColor
.
一切正常...除了有时,文本字段有一个意想不到的稍微深色的半透明背景。
(在某些屏幕上很难看到,但确实存在。)
问:为什么会出现这个较暗的背景?
当然:我能做些什么来解决它?
我很确定是渐变破坏了某些东西,但我找不到什么...
注意:项目在 Swift 但我可以阅读 Objective-C 答案。
编辑:
所以它确实似乎来自后面的渐变,请参阅测试 window 的另一个屏幕截图。这次渐变是在 NSTextView 下的自定义视图中绘制的,并且发生了同样的不良效果:部分文本字段背景可见但不应该。
更新:
我在一个项目中做了一个非常简单的例子来测试,用渐变来更直观地表现现象。只有一个 window、我的渐变 class 和一个文本字段。您可以在 this ZIP file.
中获得(仅限 30ko)
我猜您的文本字段没有分层支持。如果没有,请至少为文本字段打开图层(在 IB 中或通过 -wantsLayer
用于代码中的视图)。如果单独这样做不起作用,请尝试为渐变托管视图打开图层。
你总是在脏矩形中绘制渐变。当文本更改时,该矩形只是文本字段的大小,而不是整个视图的大小。然后,您的 drawRect 函数会在文本字段的背景矩形中绘制完整的渐变,而不仅仅是您通过文本字段看到的背景视图范围内的渐变部分。
如果您使用视图的框架重绘并忽略脏矩形参数,您应该会得到想要的外观。
更新:
我已经添加了一个示例项目用于测试,请参阅 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
。
NSTextField
在awakeFromNib
中设置为drawsBackground = false
,在IB中设置为borderless
。
我在这里没有使用 NSAttributedString
,只是更改了 NSTextFields 的 stringValue
,当然还有它们的 textColor
.
一切正常...除了有时,文本字段有一个意想不到的稍微深色的半透明背景。
(在某些屏幕上很难看到,但确实存在。)
问:为什么会出现这个较暗的背景?
当然:我能做些什么来解决它?
我很确定是渐变破坏了某些东西,但我找不到什么...
注意:项目在 Swift 但我可以阅读 Objective-C 答案。
编辑:
所以它确实似乎来自后面的渐变,请参阅测试 window 的另一个屏幕截图。这次渐变是在 NSTextView 下的自定义视图中绘制的,并且发生了同样的不良效果:部分文本字段背景可见但不应该。
更新:
我在一个项目中做了一个非常简单的例子来测试,用渐变来更直观地表现现象。只有一个 window、我的渐变 class 和一个文本字段。您可以在 this ZIP file.
中获得(仅限 30ko)我猜您的文本字段没有分层支持。如果没有,请至少为文本字段打开图层(在 IB 中或通过 -wantsLayer
用于代码中的视图)。如果单独这样做不起作用,请尝试为渐变托管视图打开图层。
你总是在脏矩形中绘制渐变。当文本更改时,该矩形只是文本字段的大小,而不是整个视图的大小。然后,您的 drawRect 函数会在文本字段的背景矩形中绘制完整的渐变,而不仅仅是您通过文本字段看到的背景视图范围内的渐变部分。
如果您使用视图的框架重绘并忽略脏矩形参数,您应该会得到想要的外观。