SwiftUI 系统光标

Jac*_*ter 5 mouse pointers cursor swift swiftui

我正在尝试在MacOS 上的SwiftUI 中将光标更改为十字准线。

我已将以下代码放入AppDelegate applicationDidFinishLaunching()函数中:

NSCursor.crosshair.set()
Run Code Online (Sandbox Code Playgroud)

当应用程序加载时,我看到光标变为十字线,然后直接交换回标准指针。

很高兴听到我在这里做错了什么。

谢谢大家。

Asp*_*eri 12

这不是工作的方式NSCursor。有一堆光标,因此任何标准(或非标准)控件都可以将自己的光标类型推到顶部并使该光标成为当前光标。所以你只需放置第一个光标,然后一些具有自己默认光标的标准视图替换它。

由于 SwiftUI 现在不允许本地管理游标,解决方案可能是

a) 在 SwiftUI 视图上设置/推动所需的光标出现/消失,或

b)NSHostingController使用标准NSView.addCursorRect方法添加光标 rect 以查看。

更新:现有项目的一些快速演示(自定义按钮解决方案的一部分)

演示

struct DemoCustomCursor: View {
    var body: some View {
        Button(action: {}) {
            Text("Cross Button")
                .padding(20)
                .background(Color.blue)
        }.buttonStyle(PlainButtonStyle())
        .onHover { inside in
            if inside {
                NSCursor.crosshair.push()
            } else {
                NSCursor.pop()
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这让我完成了 90% 的工作,但不幸的是,单击按钮会清除光标——似乎是在按钮更改内容时。无法使其与悬停、onTapGesture 等的任何组合一起使用。 (4认同)
  • 看起来与 SwiftUI 之前的问题相同 http://cocoadev.github.io/CursorFlashingProblems/ 在 DragGesture 和 NSApp.windows[0].enableCursorRects 的开头添加 `NSApp.windows[0].disableCursorRects()` `.onEnded` 中的 ()` 在这里为我解决了问题。除了“NSApp.windows[0]”并不总是前窗口。该死。`NSApp.windows.forEach { $0.disableCursorRects() }` 可以工作。;) (3认同)