Skip to content

Instantly share code, notes, and snippets.

@josejuanqm
Created January 12, 2024 06:59
Show Gist options
  • Select an option

  • Save josejuanqm/45998b521293a13bb9cb825b9958d233 to your computer and use it in GitHub Desktop.

Select an option

Save josejuanqm/45998b521293a13bb9cb825b9958d233 to your computer and use it in GitHub Desktop.
Transparent background window with SwiftUI on macOS
import SwiftUI
class WindowBackedHelperView: NSView {
var didMoveToWindow: (NSWindow) -> Void
init(didMoveToWindow: @escaping (NSWindow) -> Void) {
self.didMoveToWindow = didMoveToWindow
super.init(frame: .zero)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidMoveToWindow() {
super.viewDidMoveToWindow()
guard let window else {
return
}
didMoveToWindow(window)
}
}
struct WindowBackedView: NSViewRepresentable {
typealias NSViewType = WindowBackedHelperView
var didMoveToWindow: (NSWindow) -> Void
func makeNSView(context: Context) -> WindowBackedHelperView {
WindowBackedHelperView {
didMoveToWindow($0)
}
}
func updateNSView(_ nsView: WindowBackedHelperView, context: Context) {
}
}
struct DidMoveToWindowModifier: ViewModifier {
var didMoveToWindow: (NSWindow) -> Void
func body(content: Content) -> some View {
content
.background(
WindowBackedView {
didMoveToWindow($0)
}
)
}
}
extension View {
func didMoveToWindow(_ completion: @convention(block) @escaping (NSWindow) -> Void) -> some View {
self.modifier(DidMoveToWindowModifier(didMoveToWindow: completion))
}
}
struct ContentView: View {
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")
}
.padding()
.didMoveToWindow { window in
window.isOpaque = false
window.backgroundColor = .clear
}
}
}
@StephenDaly
Copy link

Thank you for this!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment