macos - 透明背景 NSWindow 未恢复

标签 macos swift cocoa transparent nswindow

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

当我隐藏标签时,透明 View 不会恢复:

隐藏捕获图像之前:

enter image description here

隐藏捕获图像后:

enter image description here

如何修复它?

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属性初始值为true(textfield以隐藏状态初始化)时,它可以正常工作。

最佳答案

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

因此,在更改其绘制方式后,无论是隐藏 View 还是重新绘制 View ,您都需要在窗口上调用 invalidateShadow()

关于macos - 透明背景 NSWindow 未恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32733820/

相关文章:

macos - 在 OSX 中打开和关闭网络连接的命令行方法

c - OSX 上损坏的 vanity-gen 程序

ios - UITableView滑动编辑

swift - 重载??结果类型运算符

ios - 我是否同时需要变量和属性?

objective-c - 编写 NSPredicate 格式字符串来测试多个属性的更短方法?

cocoa - CF内存分配示例

ruby - Mac High Sierra 上的 vim ruby​​ 不匹配

java - 以编程方式从 Java 卸载驱动器

ios - 下标使用不明确?