问题描述
我基于带有 NSViewRepresentable 的 NSButton 构建了一个 NativeButton 来检测右键单击。
它工作正常,但如果单击它,我不会像普通按钮那样获得“视觉反馈”。
如果单击按钮(与任何普通按钮一样),我如何才能使按钮变暗?
struct TEST_NativeButton: View {
var body: some View {
vstack{
Text("Test Native Button")
NativeButton(
rightClickAction: {print("rightclick")},leftClickAction: {print("leftclick")}
)
{ print("standard action")
}
}.frame(width: 200,height: 200)
}
}
struct NativeButton: NSViewRepresentable {
typealias NSViewType = NativeNSButton
let rightClickAction: ActionFunction
let leftClickAction: ActionFunction
let standardAction: ActionFunction
init(
rightClickAction : ActionFunction? = nil,leftClickAction : ActionFunction? = nil,standardAction: @escaping ActionFunction
)
{
if let rightClickAction = rightClickAction{
self.rightClickAction = rightClickAction
} else {
self.rightClickAction = {}
}
if let leftClickAction = leftClickAction{
self.leftClickAction = leftClickAction
} else {
self.leftClickAction = standardAction
}
self.standardAction = standardAction
}
func makeNSView(context: Context) -> NativeNSButton {
NativeNSButton(
rightClickAction: rightClickAction,leftClickAction: leftClickAction,standardAction: standardAction)
}
func updateNSView(_ nsView: NativeNSButton,context: Context) {
//Todo auf änderungen am Titel reagieren
return
}
}
class NativeNSButton: NSButton {
let standardAction: () -> Void
let rightClickAction: () -> Void
let leftClickAction: () -> Void
init(
rightClickAction : @escaping () -> Void,leftClickAction : @escaping () -> Void,standardAction: @escaping () -> Void) {
self.standardAction = standardAction
self.rightClickAction = rightClickAction
self.leftClickAction = leftClickAction
super.init(frame: .zero)
self.title = title
self.alignment = alignment
self.target = self
self.action = #selector(clickButton(_:))
bezelStyle = .rounded
isBordered = true
focusRingType = .none
self.translatesAutoresizingMaskIntoConstraints = false
self.setContentHuggingPriority(.defaultHigh,for: .vertical)
self.setContentHuggingPriority(.defaultHigh,for: .horizontal)
}
required init?(coder: NSCoder) {
fatalError()
}
override func mouseDown(with theEvent: NSEvent) {
//print("left mouse")
leftClickAction()
}
override func rightMouseDown(with theEvent: NSEvent) {
//print("right mouse")
rightClickAction()
}
@objc func clickButton(_ sender: BbcNSButton) {
//print("standard action")
standardAction()
}
}
标准动作用于检测Keyboard-Shortcuts(在本例中删除)。
解决方法
调用超级方法
override func mouseDown(with theEvent: NSEvent) {
super.mouseDown(with: theEvent)
//print("left mouse")
leftClickAction()
}