如何处理 SKView() 之外的黑色区域在 Swift Playground 中

问题描述

我正在尝试在 Swift Playground 中运行的工作中使用 SpriteKit+SwiftUI。这是我的一些代码

struct SwiftUI: View {
    var body: some View {
         test() 
    }
}
struct Test: UIViewRepresentable {
    func makeUIView(context: Context) -> SKView {
        let sceneView = SKView()
        let gameScene = GameScene()
        gameScene.size = CGSize(width: 500,height: 600)
        gameScene.scaleMode = .aspectFit
        sceneView.presentScene(gameScene)
        return sceneView
    }
    func updateUIView(_ uiView: SKView,context: Context) {
    }
}

它运行良好,但总是有这个可怕的黑色区域超出我的 SKView,如下图所示。
Black area in the View
我曾尝试更改 sceneView.backgroundcolor,或更改 gameScene.sizesceneView.size,但这些都不起作用。 ? 如果您能给我一些建议,非常感谢!

解决方法

问题是对 Test() 的调用也需要明确设置帧大小。否则,Test 视图会占用整个可用屏幕空间,而场景视图仅占用该空间的一部分。

下面的示例与您发布的示例相同,在 Test() 上设置了一个显式框架(和一个虚拟的 GameScene)。这适用于操场,结果只是一个紫色方块,视野之外没有黑色区域:

import SwiftUI
import SpriteKit
import PlaygroundSupport

let width: CGFloat = 500
let height: CGFloat = 500

struct ContentView: View {
    var body: some View {
         Test()
            .frame(width: width,height: height)
    }
}
struct Test: UIViewRepresentable {
    func makeUIView(context: Context) -> SKView {
        let sceneView = SKView()
        let gameScene = GameScene()
        gameScene.size = CGSize(width: width,height: height)
        gameScene.scaleMode = .aspectFit
        sceneView.presentScene(gameScene)
        return sceneView
    }
    func updateUIView(_ uiView: SKView,context: Context) {
    }
}

class GameScene: SKScene {
    override func didMove(to view: SKView) {
        let node = SKShapeNode(rect: CGRect(x: 0,y: 0,width: size.width,height: size.height))
        node.fillColor = .purple
        addChild(node)
    }
}


PlaygroundPage.current.setLiveView(ContentView())