我在 SwiftUI 中有一个标尺,如下所示:
struct RulerScrollView<Content: View>: NSViewRepresentable {
@ObservedObject var dm: DrawModel
let content: Content
init(_ dm: DrawModel, @ViewBuilder content: () -> Content ) {
self.dm = dm
self.content = content()
}
override func mouseDown(with event: NSEvent) {
if event.clickCount == 2 {
NotificationCenter.default.post(name: Notification.Name("ShowRulerSettings"), object: nil)
}
}
func makeNSView(context: Context) -> NSScrollView {
let scrollView = NSScrollView()
scrollView.hasVerticalRuler = true
scrollView.hasHorizontalRuler = true
scrollView.rulersVisible = dm.showRulers
let hostingView = NSHostingView(rootView: content)
hostingView.wantsLayer = true
hostingView.layer?.backgroundColor = NSColor.white.cgColor
scrollView.documentView = hostingView
return scrollView
}
func updateNSView(_ nsView: NSScrollView, context: Context) {
nsView.rulersVisible = dm.showRulers
}
}
它的名字是这样的:
Stack {
RulerScrollView( dm ) {
DrawingView( dm )
.onReceive(dm.$showRulerSettings) { isShowingRulerSettings = $0 }
}
.background(Color.white)
}
.alert(isPresented: $isShowingRulerSettings) {
Alert(title: Text("Ruler Settings"), message: Text("Settings here"), primaryButton: .default(Text("OK")), secondaryButton: .cancel()) }
不幸的是我收到此错误:
'override'只能在类成员上指定
我将其添加到我的 RulerView 中:
func makeCoordinator() -> Coordinator {
Coordinator(onRulerDoubleClick: onRulerDoubleClick)
}
class Coordinator: NSObject {
var onRulerDoubleClick: () -> Void
init(onRulerDoubleClick: @escaping () -> Void) {
self.onRulerDoubleClick = onRulerDoubleClick
}
@objc func handleRulerDoubleClick(_ gestureRecognizer: NSClickGestureRecognizer) {
onRulerDoubleClick() // Trigger the callback for double-click event
}
}
我将其添加到 makeNSView 中:
let horizontal = NSClickGestureRecognizer(target: context.coordinator, action: #selector(Coordinator.handleRulerDoubleClick))
horizontal.numberOfClicksRequired = 2
scrollView.horizontalRulerView?.addGestureRecognizer(horizontal)
let vertical = NSClickGestureRecognizer(target: context.coordinator, action: #selector(Coordinator.handleRulerDoubleClick))
vertical.numberOfClicksRequired = 2
scrollView.verticalRulerView?.addGestureRecognizer(vertical)
然后我这样称呼它:
RulerView( dm ) {
DrawingView( dm )
} onRulerDoubleClick: { isShowingRulerSettings.toggle( )}
.popover(isPresented: $isShowingRulerSettings, arrowEdge: .trailing) {
RulerSettings( dm )
}
我发现 NS 有点痛苦,我希望 SwiftUI 继续发展。 :)