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

标签 cocoa swift gradient nswindow nstextfield

更新:

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

原始问题:

我有一个 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

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

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

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

NOT GOOD

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

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

当然:我能做些什么来修复它?

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

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

编辑:

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

Example 2

更新:

我在一个项目中做了一个非常简单的例子来测试,用渐变来更直观地显示现象。只有一个窗口、我的渐变类和一个文本字段。您可以在 this ZIP file. 中获得(仅限 30ko)

example in project

最佳答案

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

如果您使用 View 的框架重绘,并忽略脏矩形参数,您应该获得所需的外观。

关于cocoa - 意外的 NSTextField 背景颜色,应该是透明的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29868429/

相关文章:

swift - ReactiveCocoa 对成员 RACSignal 的引用不明确

javascript - 创建描述点的离散分布的颜色渐变

html - 按钮的渐变不起作用

objective-c - "Last Opened"日期

swift - '?' 如何在 case let 声明中解包可选值?

swift - 我的 if 语句/代码测试是否正确 Swift

android - 如何预分配 RadialGradient?

cocoa - 可选的NSTextField和NSColorPanel –如何打破它们不希望的相互作用?

objective-c - 当我的对象的工作表显示时,如何通知它?

cocoa - 从 LaunchDeamon 捕获应用程序终止