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