透明背景 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()
。
我有一个自定义的 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()
。