繁体   English   中英

如何在SKScene中设置自定义光标? (XCode,Swift4,Spritekit)

[英]How to set a custom cursor in an 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行出现错误,提示“意外找到nil”。

因此,我将代码更改为此:

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有关。 在此先感谢您的帮助。

NSImage(byReferencingFile:)文档中,

此方法延迟初始化图像对象。 在应用尝试绘制图像或请求有关该图像的信息之前,它实际上不会打开指定文件或根据其数据创建任何图像表示形式。

结果,当addCursorRect()方法时,不会从文件中加载图像。 实际上,图像大小为(height:0,width: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)

另外,只能从resetCursorRects()方法中调用addCursorRect(image:,hotSpot:) 从文档中

此方法只能由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)
            }
        }
    }
}

突出显示光标图像的Project Navigator。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM