Фон не заполняет весь вид SpriteKit

По какой-то причине мой код не заполнит всю SKScene. Вот код, который я использую в Xcode 12 Beta 5.

GameScene.swift

class GameScene: SKScene {
 
    override func didMove(to view: SKView) {
        let background = SKSpriteNode(imageNamed: "space")
        background.zPosition = 0
        background.anchorPoint = CGPoint(x: 0.5, y: 0.5) // default
        background.position = CGPoint(x: frame.midX, y: frame.midY)
        print("frame.size  \(frame.size)")
        print("self.size  \(self.size)")
        print("view  \(view.frame.size)")
        background.size = CGSize(width: self.size.width, height: self.size.height)
                self.addChild(background)
    }

}

GameViewController.swift

class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        

        if let scene = GKScene(fileNamed: "GameScene") {
            
            if let sceneNode = scene.rootNode as! GameScene? {


                // Present the scene
                if let view = self.view as! SKView? {
                    sceneNode.size = view.bounds.size
                    sceneNode.anchorPoint = CGPoint.zero
                    sceneNode.scaleMode = .aspectFit
                    
                    print("view.bounds.size  \(view.bounds.size)")
                    view.presentScene(sceneNode)
                    
                    view.ignoresSiblingOrder = true
                    
                    view.showsFPS = true
                    view.showsNodeCount = true
                }
            }
        }
    }

    override var shouldAutorotate: Bool {
        return true
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if UIDevice.current.userInterfaceIdiom == .phone {
            return .allButUpsideDown
        } else {
            return .all
        }
    }

    override var prefersStatusBarHidden: Bool {
        return true
    }
}

Также по какой-то причине мой размер представления сообщает ->

frame.size (320.0, 480.0) self.size (320.0, 480.0) view (320.0,480.0)

Но мой GameScene.sks настроен на -> w750, h1336

Почему мой код отсекает верхнюю и нижнюю части фона?

1 ответ

Решение

Это будет звучать глупо, но есть ли у вас экран запуска? У меня была та же проблема, которая возникла бы только в Xcode 12, а не 11, но основное различие, которое я обнаружил, заключалось в том, что Xcode 11 имеет экран запуска. Как только я добавил раскадровку экрана запуска и добавил ее в свой список, мой SCNView заполнил экран. Я не уверен, почему это может привести к тому, что представление не будет следовать ограничениям, но после добавления его в другие мои проекты проблема устраняется.

Изменить: вам не нужно иметь раскадровку экрана запуска, вы можете просто добавить свою основную раскадровку, которая отображает вашу сцену в списке под "Базовое имя файла интерфейса экрана запуска".

Это определенно вызвано отсутствием назначенного экрана запуска. Очень странно, что Xcode 12 по умолчанию имеет такое поведение для SpriteKit. Я уверен, что многие люди будут озадачены и сбиты с толку. Я заметил, что основным видимым отличием от более ранних версий было отсутствие экрана запуска.

Вы можете либо создать экран запуска и назначить его, либо определить Main.storyboard в качестве экрана запуска, как предлагалось ранее. Вероятно, самый простой способ заставить его работать - это перейти к цели проекта, затем "Общие" и выбрать "Main", где указано "Launch Screen File". Это заставит его работать так, как ожидалось.

Как выбрать Main в качестве файла экрана запуска вашего проекта:

Как выбрать Main в качестве файла экрана запуска вашего проекта

Другие вопросы по тегам