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

时间:2018-04-29 19:45:20

标签: swift sprite-kit cursor mouse nscursor

我想为我的项目使用自定义光标。现在,使用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的。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

来自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()方法,并在Storyboard中更改视图的类(到我们的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。

enter image description here