透明背景 NSWindow 未恢复

Transparent background NSWindow was not recovered

我有一个自定义的 NSWindow (BorderlessWindow.swift) 和 NSView (TransparentView.swift),我向 TransparentView 添加了一个标签 (NSTextField)。

当我隐藏标签时,TransparentView没有恢复:

隐藏之前捕获图像:

隐藏捕获图像后:

我该如何解决?

BorderlessWindow.swift

class BorderlessWindow: NSWindow {

override init(contentRect: NSRect, styleMask aStyle: Int, backing bufferingType: NSBackingStoreType, `defer` flag: Bool) {

    super.init(contentRect: contentRect,
        styleMask: NSBorderlessWindowMask,
        backing: NSBackingStoreType.Buffered,
        `defer`: false)

    self.alphaValue = 1.0
    self.opaque = false
    self.movableByWindowBackground = true

}

@IBOutlet weak var testString: NSTextField!

@IBAction func clicked(sender: NSButton) {
    if testString.hidden == false {
        testString.hidden = true
    }
    else {
        testString.hidden = false
    }
}

override var canBecomeKeyWindow:Bool {
    get {
        return true
    }
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
}

TransparentView.swift

class TransparentView: NSView {

override func drawRect(dirtyRect: NSRect) {

    super.drawRect(dirtyRect)

    NSColor.clearColor().set()
    NSRectFill(self.bounds)

    let path = NSBezierPath(roundedRect: self.bounds, xRadius: 10, yRadius: 10)
    let path2 = NSBezierPath(roundedRect: NSMakeRect(self.bounds.origin.x + 10, self.bounds.origin.y + 10, self.bounds.size.width - 20, self.bounds.size.height - 20), xRadius: 10, yRadius: 10)

    NSColor(calibratedRed: 1, green: 0.7, blue: 0, alpha: 0.5).setFill()
    NSColor(calibratedRed: 1, green: 1, blue: 1, alpha: 1).setStroke()

    path2.lineWidth = 3.0
    path.lineJoinStyle = NSLineJoinStyle.RoundLineJoinStyle
    path.lineCapStyle = NSLineCapStyle.RoundLineCapStyle


    path2.fill()
    path2.stroke()

    // Drawing code here.
}



override init(frame frameRect: NSRect) {
    super.init(frame: frameRect)
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
}

}

我发现: 当textField的初始值hidden 属性为真时(textfield初始化为hidden状态),它工作正常。

对于有透明部分的window,需要在更改绘制后使阴影无效。阴影是根据不透明(或大部分不透明)部分计算得出的,因此取决于绘制的内容。

因此,在更改绘制方式后,无论是隐藏视图还是重绘视图,都需要在 window 上调用 invalidateShadow()