如何在SKScene中设置自定义光标?(XCode、Swift4、SpriteKit)
解决macOS自定义NSCursor不生效的问题
看起来你在设置自定义光标时遇到了麻烦——系统光标能正常工作,但自定义光标就是没显示出来。我来帮你排查几个常见问题,再给你一个能正常运行的示例代码:
常见问题排查
- 图片资源是否正确加载:
NSImage(named: "hand1.png")里的文件名要完全匹配项目里的资源名(macOS文件名区分大小写),还要确保图片已经添加到Xcode项目并勾选了Target Membership。建议先判断图片是否加载成功,避免强制解包引发崩溃:guard let image = NSImage(named: "hand1.png") else { print("自定义光标图片加载失败!") return } - addCursorRect的范围是否正确:你用的
self.frame如果是ViewController的frame,那可能不是目标视图的有效范围,应该用self.view!.bounds来覆盖整个视图区域(bounds是视图自身的坐标体系,更适合定义光标生效范围)。 - 设置时机是否合适:
didMove(to view:)或sceneDidLoad()可能太早,此时视图布局还没完全确定,建议移到viewDidAppear(_:)里执行,确保视图已经完成布局并显示。
可运行的示例代码
把这段代码放到你的ViewController里,替换成你的图片和热区坐标即可:
override func viewDidAppear() { super.viewDidAppear() // 确保图片加载成功 guard let cursorImage = NSImage(named: "hand1.png") else { print("无法找到光标图片") return } // 设置光标热区(根据你的图片调整,比如图片左上角为(0,0),这里定义你想要的点击触发点) let hotSpot = NSPoint(x: 4, y: 8) let customCursor = NSCursor(image: cursorImage, hotSpot: hotSpot) // 给整个视图添加光标生效区域 view.addCursorRect(view.bounds, cursor: customCursor) }
额外注意事项
- 如果你的视图有子视图,子视图可能会覆盖父视图的光标设置,需要确保子视图没有自定义cursorRect,或者允许父视图的光标规则生效。
- 如果只需要在特定区域显示自定义光标,把
view.bounds换成你想要的CGRect范围即可。
内容的提问来源于stack exchange,提问作者Vaclav
相关产品推荐
相关产品推荐

