Я пытаюсь использовать представление SwiftUI в качестве NSCursor в MacOS.
Используя SwiftUI, я создаю представление, которое затем преобразовываю в NSView с использованием NSHostingView
. Теперь я пытаюсь преобразовать это в NSImage
через NSBitmapImageRep
. По какой-то причине я всегда получаю пустой png при проверке переменных во время установки точек останова.
(На данный момент настройка курсора выполняется в AppDelegate
, потому что в данный момент я просто пытаюсь заставить это работать.)
class AppDelegate: NSObject, NSApplicationDelegate {
var window: NSWindow!
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Create the SwiftUI view that provides the window contents.
let contentView = ContentView()
let contentRect = NSRect(x: 0, y: 0, width: 480, height: 480)
// Create the window and set the content view.
window = NSWindow(
contentRect: contentRect,
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
backing: .buffered, defer: false)
window.center()
window.setFrameAutosaveName("Main Window")
window.contentView = NSHostingView(rootView: contentView)
window.makeKeyAndOrderFront(nil)
let myNSView = NSHostingView(rootView: ContentView()).bitmapImageRepForCachingDisplay(in: contentRect)!
NSHostingView(rootView: ContentView()).cacheDisplay(in: contentRect, to: myNSView)
let myNSImage = NSImage(size: myNSView.size)
myNSImage.addRepresentation(myNSView)
self.window.disableCursorRects()
// var myName = NSImage.Name("ColorRing")
// var myCursorImg = NSImage(named: myName)!
//
// var myCursor = NSCursor(image: myCursorImg, hotSpot: NSPoint(x: 10, y: 10))
var myCursor = NSCursor(image: myNSImage, hotSpot: NSPoint(x: 0, y: 0))
myCursor.set()
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
}
При выполнении закомментированной части я получаю курсор мыши из внешнего png-файла.
При выполнении кода, показанного выше, я всегда получаю пустой курсор мышис размером 480х480. В режиме отладки я вижу, что myNSView
- пустой png. Я почти уверен, что неправильно понял документацию и поэтому неправильно использую cacheDisplay(in:to:)
и bitmapImageRepForCachingDisplay(in:)
. Документация говорит мне использовать NSBitmapImageRep
с bitmapImageRepForCachingDisplay(in:)
в cacheDisplay(in:to:)
. Но по какой-то причине я просто не могу заставить это работать.
Кто-нибудь имеет представление, что я делаю неправильно?