【问题标题】:SwiftUI + SpriteView = Gray screenSwiftUI + SpriteView = 灰屏
【发布时间】:2021-07-11 20:57:13
【问题描述】:

Xcode 13 测试版 2、iOS 15 测试版 2。

以下代码会产生灰屏:
SKScene GameScene.didMove(to:) 永远不会被调用)

import SwiftUI
import SpriteKit

// A simple game scene with falling boxes
class GameScene: SKScene {
    override func didMove(to view: SKView) {
        physicsBody = SKPhysicsBody(edgeLoopFrom: frame)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        guard let touch = touches.first else { return }
        let location = touch.location(in: self)
        let box = SKSpriteNode(color: SKColor.red, size: CGSize(width: 50, height: 50))
        box.position = location
        box.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 50, height: 50))
        addChild(box)
    }
}

// A sample SwiftUI creating a GameScene and sizing it at 300x400 points
struct ContentView: View {
    var scene: SKScene {
        let scene = GameScene()
        scene.size = CGSize(width: 300, height: 400)
        scene.scaleMode = .fill
        return scene
    }

    var body: some View {
        SpriteView(scene: scene)
            .frame(width: 300, height: 400)
            .ignoresSafeArea()
    }
}

我不知道如何修复/解决此问题。
有什么想法吗?

(适用于以前的 Xcode / Swift 版本)

【问题讨论】:

    标签: swiftui spriteview


    【解决方案1】:

    该问题已在 Xcode 13 beta 5 / iOS 15 beta 5 中修复。

    【讨论】:

      【解决方案2】:

      这可能是因为场景是一个计算变量。因此,每次重绘视图或访问场景时,都会重新计算它,从而创建并初始化一个新的 GameScene 对象。尝试更多类似的方法,其中 GameModelGameScene 只创建一次。 (您可能可以对其进行改进,并且不必再设置两次大小):

      class GameScene: SKScene { // keep the same }
      
      class GameModel: ObservableObject {
        let scene: SKScene = {
          let scene = GameScene()
          scene.size = CGSize(width: 300, height: 400)
          scene.scaleMode = .fill
          return scene
        }()
      }
      
      struct ContentView: View {
          @StateObject var model = GameModel()
          var body: some View {
            SpriteView(scene: model.scene)
              .frame(width: 300, height: 400)
                  .ignoresSafeArea()
          }
      }
      

      【讨论】:

      • StateObject 的好点,但不幸的是,事实并非如此。显示相同的灰色屏幕。奇怪的是,相同的代码适用于以前的 Xcode / Swift 版本。我给它填了一个错误。 :-/
      猜你喜欢
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多