在 NSButton 中绘制 NSString 时绘制工件

Drawing artifacts when drawing a NSString in a NSButton

我正在使用 drawRect 在自定义视图中绘制一个 NSString,它是 NSButton 的子视图。 NSButton 的 drawRect 也在绘制一个 NSImage,这似乎是问题所在。如果我删除 NSImagedrawRect 代码,它就不会再发生(但那样我就没有背景了)。

这是自定义视图 drawRect(缩写):

override func drawRect(dirtyRect: NSRect) {
    super.drawRect(dirtyRect)

    let string: NSString = NSString(string: thermostat.displayTargetTemperature())
    string.drawAtPoint(NSMakePoint(CGFloat(width), CGFloat(y)), withAttributes: self.attributes)

}

这里是 NSButton drawRect:

override func drawRect(dirtyRect: NSRect) {
    var image = NSImage(named: FILDarkManager.enabled ? "preferences-statusbar-bg-dark" : "preferences-statusbar-bg-light")

    if (self.state == NSOnState) {
        image?.drawInRect(dirtyRect, fromRect: NSZeroRect, operation: NSCompositingOperation.CompositeSourceOver, fraction: 1.0, respectFlipped: true, hints: nil)
    }
    else {
        image?.drawInRect(dirtyRect, fromRect: NSZeroRect, operation: NSCompositingOperation.CompositeSourceOver, fraction: 0.8, respectFlipped: true, hints: nil)
    }

    super.drawRect(dirtyRect)
}

可能是画NSImage时的操作有关?

奇怪的是,如果我将鼠标悬停在视图上,它会正确绘制。

尝试将图像绘制到 [self bounds] 而不是 dirtyRect。

绘制字符串可能会弄脏按钮的一部分,导致您的代码将图像绘制到那个 dirtyRect 中。