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

SwiftUI中SpriteView内SKScene尺寸为1、坐标偏移问题求助

SwiftUI中SpriteView的坐标系统与SKScene尺寸问题

我在SwiftUI应用中使用SpriteView时遇到了坐标系统的困惑。我开发了一个名为Spriteoscope的测试小程序,它会在SKScene中绘制64×64的方块网格(我称之为“像素”),通过改变方块颜色实现动画效果。SKScene的初始化代码开头为:

let pixelSize = min(self.size.width / Double(numColumns), self.size.height / Double(numRows))

随后我通过从-self.size.width/64到+self.size.width/64循环绘制尺寸为pixelSize的方块,使网格居中于SKScene的中心原点(0,0)。该SKScene原本在NSViewController或UIView中运行完全正常。

在将应用转为SwiftUI实现后,使用SpriteView完成了转换,但运行后发现所有内容都被推至左下角。调试时发现SKScene的尺寸为1×1,这超出预期。虽然像素会被缩放至视图大小,但负坐标部分全部超出屏幕,导致位置错误。

我曾怀疑是执行顺序问题——SKScene在视图布局前被初始化,但实际并非如此。我将SpriteView包裹在GeometryReader中,确认其尺寸确实为预期的480×480,且Scene的初始化方法确实是在SpriteView设置完成后调用的。

为何SKScene的原点(0,0)位于左下角而非中心,且尺寸为1×1?我查阅了SpriteView和SpriteView.options的文档,但未找到相关提示,请问我遗漏了什么?

相关SwiftUI代码如下:

@State private var scene = SpriteoscopeScene()

var body: some View {
    HStack {
        VStack {
            Spacer()
            Button("pause") { scene.pauseKalidescope() } .buttonStyle(DefaultButtonStyle())
        }.padding()
        SpriteView(scene: scene)
        VStack {
            Spacer()
            Button("reset") { scene.setupKalidescope() } .buttonStyle(DefaultButtonStyle())
        }.padding()

    }
    .frame(width: 640, height: 480)
}

内容的提问来源于stack exchange,提问作者Maury Markowitz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:35:14