当窗口处于非活动状态时,不会点击带有 PlainButtonStyle 的按钮

问题描述 投票:0回答:1

我正在编写一个 MacOS 应用程序。我正在显示一个按钮。当应用程序处于非活动状态时,如果我单击按钮,按钮的点击事件将在窗口激活的同时触发。到目前为止一切顺利。

但是,如果我现在将

.buttonStyle(PlainButtonStyle())
添加到我的按钮(这是所需的外观),则当窗口处于非活动状态时,它不会被点击。第一次单击会激活窗口,我需要第二次单击才能触发按钮。

Button {
  print("tapped!")
} label: {
  Image(systemName: "doc.on.doc")
    .resizable()
    .frame(width: 14, height: 14)
    .padding(5)
}
.buttonStyle(PlainButtonStyle())
macos swiftui
1个回答
0
投票

视图是否可以在窗口未激活的情况下接收单击事件,由

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()
© www.soinside.com 2019 - 2024. All rights reserved.