Как установить пользовательский курсор в SKScene? (XCode, Swift4, Spritekit)

Я хочу использовать собственный курсор для моего проекта. Теперь использование одного из системных курсоров в XCode не так уж и важно, я просто вызываю:

NSCursor.crosshair() .set() 

(просто пример)

Это работает нормально, но затем я пытаюсь установить свой собственный курсор следующим образом: (внутри didMove: для просмотра или внутри sceneDidLoad(), кажется, что неважно, какой.)

let image = NSImage(named: "hand1.png")
let spot = NSPoint(x: 4, y: 8)
let customCursor = NSCursor(image: image!, hotSpot: spot)
self.view!.addCursorRect(self.frame, cursor:customCursor)

Когда я пытаюсь собрать, я получаю сообщение об ошибке в строке 3, говорящее "неожиданно найден ноль".

Итак, я изменил код на это:

let image = NSImage(byReferencingFile: "hand1.png")
let spot = NSPoint(x: 4, y: 8)
let customCursor = NSCursor(image: image!, hotSpot: spot)
self.view!.addCursorRect(self.frame, cursor: customCursor)

Сейчас проект строится, но ничего не происходит. Курсор не меняется.

Я также попробовал эти строки здесь:

NSCursor.init(image: image!, hotSpot: spot)
NSCursor.set(customCursor)()

Опять же, проект строится, но курсор не меняется. Что я здесь не так делаю?

Я пытался следовать всем рекомендациям, которые мог найти, но документация Apple по событиям курсора не сильно помогает, поскольку ее сильно устаревшие и связанные с мышью темы, как правило, очень редки, так как большинство вещей посвящено ios. Заранее спасибо за помощь.

1 ответ

От NSImage(byReferencingFile:) документы,

Этот метод инициализирует объект изображения лениво. На самом деле он не открывает указанный файл и не создает какие-либо представления изображений из своих данных, пока приложение не попытается нарисовать изображение или запросить информацию о нем.

В результате изображение не загружается из файла, когда addCursorRect() метод называется. Фактически, размер изображения (высота:0, ширина:0), как показано ниже.

if let image = NSImage(byReferencingFile:"cursorImage.png") {
    print("\(image.size)")
}

// (0.0, 0.0)

Я предлагаю вам использовать NSImage(named:) создать изображение из файла:

if let image = NSImage(named:NSImage.Name("cursorImage.png")) {
    print("\(image.size)")
}

// (32.0, 32.0)

Также, addCursorRect(image:,hotSpot:) следует вызывать только из resetCursorRects() метод. Из документов,

Этот метод предназначен для вызова только методом resetCursorRects(). Если вызывается любым другим способом, результирующий прямоугольник курсора будет отброшен при следующем перестроении прямоугольников курсора представления.

addCursorRect() это метод экземпляра NSView и, для SpriteKit, представление является SKView который наследует от NSView, Соответственно, вы можете подкласс SKView, переопределить подкласс addCursorRect() метод и измените класс представления (на наш подкласс SKView) в раскадровке.

В качестве альтернативы, вы можете сделать это, расширив SKView и переопределив resetCursorRects() метод. Например,

Для Xcode 9.3

extension SKView {
    override open func resetCursorRects() {
        if let image = NSImage(named:NSImage.Name(rawValue:"cursorImage.png")) {
            let spot = NSPoint(x: 0, y: 0)
            let customCursor = NSCursor(image: image, hotSpot: spot)
            addCursorRect(visibleRect, cursor:customCursor)
        }
    }
}

Для Xcode 9.2

extension SKView {
    override open func resetCursorRects() {
        if let image = NSImage(named:NSImage.Name("cursorImage.png")) {
            let spot = NSPoint(x: 0, y: 0)
            let customCursor = NSCursor(image: image, hotSpot: spot)
            addCursorRect(visibleRect, cursor:customCursor)
        }
    }
}

Для более старых версий Xcode:

extension SKView {
    override open func resetCursorRects() {
        if let path = Bundle.main.path(forResource: "cursorImage", ofType: "png") {
            if let image = NSImage(contentsOfFile:path) {
                let spot = NSPoint(x: 0, y: 0)
                let customCursor = NSCursor(image: image, hotSpot: spot)
                addCursorRect(visibleRect, cursor:customCursor)
            }
        }
    }
}

Навигатор проекта с выделенным изображением курсора.

введите описание изображения здесь

Другие вопросы по тегам