我正在编写一个 MacOS 应用程序。我正在显示一个按钮。当应用程序处于非活动状态时,如果我单击按钮,按钮的点击事件将在窗口激活的同时触发。到目前为止一切顺利。
但是,如果我现在将
.buttonStyle(PlainButtonStyle())
添加到我的按钮(这是所需的外观),则当窗口处于非活动状态时,它不会被点击。第一次单击会激活窗口,我需要第二次单击才能触发按钮。
Button {
print("tapped!")
} label: {
Image(systemName: "doc.on.doc")
.resizable()
.frame(width: 14, height: 14)
.padding(5)
}
.buttonStyle(PlainButtonStyle())
acceptsFirstMouse(for:)
方法控制。当按钮样式为 .plain
时,按钮不再由 NSButton
支持(其 acceptsFirstMouse
方法将返回 true
),因此您无法单独“点击”按钮。
您可以将
NSViewRepresentable
包裹在按钮周围,并覆盖 acceptsFirstMouse
以返回 true。
这是来自这篇博文
的代码extension SwiftUI.View {
public func acceptClickThrough() -> some View {
ClickThroughBackdrop(self)
}
}
fileprivate struct ClickThroughBackdrop<Content: SwiftUI.View>: NSViewRepresentable {
final class Backdrop: NSHostingView<Content> {
override func acceptsFirstMouse(for event: NSEvent?) -> Bool {
return true
}
}
let content: Content
init(_ content: Content) {
self.content = content
}
func makeNSView(context: Context) -> Backdrop {
let backdrop = Backdrop(rootView: content)
backdrop.translatesAutoresizingMaskIntoConstraints = false
return backdrop
}
func updateNSView(_ nsView: Backdrop, context: Context) {
nsView.rootView = content
}
}
使用示例:
Button("Foo") {
print("triggered")
}
.buttonStyle(.plain)
.acceptClickThrough()