首页 > 解决方案 > 如何处理 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 之外总是有这个可怕的黑色区域,如下图所示。
视图中的黑色区域
我试图改变sceneView.backgroundcolor,或改变gameScene.sizesceneView.size但那些只是没有工作。如果您能给我一些建议,非常感谢!

标签: swiftswiftuisprite-kit

解决方案


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

下面的示例与您发布的示例相同,在Test()(和一个 dummy 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())

推荐阅读