# When clicking on a non-active NSWindow button in SwiftUI, the button should handle the mouse event by default instead of the window.
NSView overrides the acceptsFirstMouse (opens new window) method and always returns true
.
In SwiftUI, add this overridden View to the overlay of the view.
import SwiftUI
import Cocoa
// Just mouse accepter
class MyViewView : NSView {
override func acceptsFirstMouse(for event: NSEvent?) -> Bool {
return true
}
}
// Representable wrapper (bridge to SwiftUI)
struct AcceptingFirstMouse : NSViewRepresentable {
func makeNSView(context: NSViewRepresentableContext<AcceptingFirstMouse>) -> MyViewView {
return MyViewView()
}
func updateNSView(_ nsView: MyViewView, context: NSViewRepresentableContext<AcceptingFirstMouse>) {
nsView.setNeedsDisplay(nsView.bounds)
}
typealias NSViewType = MyViewView
}
// Usage (somewhere in your SwiftUI view stack)
Text("Click me")
.padding(20)
.background(Color.yellow)
.overlay(AcceptingFirstMouse()) // must be on top (no confuse, it is transparent)
.onTapGesture {
print("Label tapped")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Author: Sintone Li
Article address: https://cleanclip.cc/developer/swiftui-nswindow-inactive-firstmouse/