I am attempting to use SpriteKit
with a SwiftUI
based interface, but have encountered an issue when initializing my SKScene
.
First, my UIViewRepresentable
that contains the SKView
has been taken from a similar question:
struct SpriteKitContainer: UIViewRepresentable {
let scene: SKScene
func makeUIView(context: Context) -> SKView {
return SKView(frame: .zero)
}
func updateUIView(_ view: SKView, context: Context) {
view.presentScene(scene)
}
}
A key piece here is that it requires the SKScene
to be initialized prior to SpriteKitContainer
being initialized.
I currently have the following abbreviated snippet doing this:
import SwiftUI
import SpriteKit
struct GameView: View {
@State private var isEnabled = true
var body: some View {
let tapGesture = TapGesture()
.onEnded { value in }
// This size is obviously wrong
let size = UIScreen.main.bounds.size
let scene = Scene(size: size)
scene.scaleMode = .resizeFill
return SpriteKitContainer(scene: scene)
.disabled(!isEnabled)
.frame(maxWidth: .infinity,
maxHeight: .infinity,
alignment: .center)
.gesture(tapGesture)
.padding(.all, 30)
}
}
I only include the TapGesture
to show why the body
is structured the way it is. With the code included, everything will work as expected, but the size used for the scene is obviously wrong (it fails to account for the padding, and navigation elements).
However, I have not found any other way to obtain a size or frame at this point, and sending over a .zero
size for the Scene(size:)
call will not size it correctly either.
My assumption is that I am missing some precursor step as I am still ramping up with SwiftUI. Otherwise, I could calculate a new CGSize
given what I know, but that strikes me as the wrong approach here.