我有一个自定义的 NSWindow (BorderlessWindow.swift) 和 NSView (TransparentView.swift),并且我向透明View 添加了一个标签 (NSTextField)。
当我隐藏标签时,透明 View 不会恢复:
隐藏捕获图像之前:
隐藏捕获图像后:
如何修复它?
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/