You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:32:02