【问题标题】:Unexpected NSTextField background color, should be transparent意外的 NSTextField 背景颜色,应该是透明的
【发布时间】:2015-04-25 17:26:24
【问题描述】:

更新:

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

原始问题:

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

我在这个窗口上有两个NSTextFields。

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

我这里没有使用NSAttributedStrings,只是改变了NSTextFields的stringValue,当然还有他们的textColor

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

(在某些屏幕上很难看到,但它就在那里。)

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

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

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

注意:该项目使用 Swift,但我可以阅读 Objective-C 的答案。

编辑:

所以确实它似乎来自后面的渐变,请参阅测试窗口中的另一个屏幕截图。这次渐变是在 NSTextView 下的 Custom View 中绘制的,同样会出现不希望出现的效果:部分文本字段背景可见但不应该。

更新:

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

【问题讨论】:

    标签: cocoa swift gradient nswindow nstextfield


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢杰里米,感谢您的回答,我今天明白了一些重要的事情。 :) 它适用于我的项目示例,我将dirtyRect替换为self.frame,实际上是perfect。但我仍然在我的实际项目中遇到问题......我会进一步检查。非常感谢!
    【解决方案2】:

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

    【讨论】:

    • 谢谢。不幸的是,它并没有改变任何东西。我首先在效果检查器的核心动画层部分中单击每个元素(文本字段和窗口视图)的复选框,但没有更改。然后我为每个元素添加了wantsLayer = true,但也没有任何变化。
    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 2012-06-26
    • 2021-07-02
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    相关资源
    最近更新 更多