Я могу заставить GameScene: SKScene появляться, используя ограничения макета, но почему я все еще могу рисовать внутри безопасных областей?

Ниже приведен код из GameViewController, который я использую для презентации своей GameScene. GameScene выходит с уважением к безопасным зонам (iPhone X).

Однако, если я создаю узел SKSprite, координаты верхнего экрана переходят в безопасную область.

У меня сложилось впечатление, что этого не произойдет, и я не могу найти верхний и нижний якоря.

p.s. кстати, я не могу просмотреть originalS.frame.width или originalS.frame.height в отладчике, они выглядят как недопустимые выражения. но они не приводят к сбою приложения.

class GameViewController: UIViewController {

    private let myView : UIView = {
        let myView = UIView()
        myView.translatesAutoresizingMaskIntoConstraints = false
        myView.backgroundColor = .clear
        return myView
    }()
    
    private func addConstraints(){
        var constraints = [NSLayoutConstraint]()
        
        constraints.append(myView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor))
        constraints.append(myView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor))
        constraints.append(myView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor))
        constraints.append(myView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor))

        NSLayoutConstraint.activate(constraints)
        
    }
    
    let logo = UIImage(named: "startup")
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(myView)
        addConstraints()
        
        if let view = self.view as! SKView?
        {
            
            myGlobalVars.widthPixels = UIScreen.main.nativeBounds.width
            myGlobalVars.heightPixels = UIScreen.main.nativeBounds.height
            myGlobalVars.widthPoints = UIScreen.main.bounds.width
            myGlobalVars.heightPoints = UIScreen.main.bounds.height

            originalS = myView
            originalS.backgroundColor = .clear

            originalS.translatesAutoresizingMaskIntoConstraints = false
            originalS.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor).isActive = true
            originalS.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
            originalS.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor).isActive = true
            originalS.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor , constant: -0).isActive = true
            

            var scene : GameScene!
                DispatchQueue.main.async {
                     scene = GameScene(size: CGSize(width: originalS.frame.width,
                                                       height: originalS.frame.height))

            
            scene.anchorPoint = CGPoint(x: 0.0, y: 0.0)
                scene.backgroundColor = .black
                scene.scaleMode = .aspectFit
                myGlobalVars.sceneRect = scene.frame
                myGlobalVars.gameScene = scene
                view.isHidden = false
                view.presentScene(scene)
            }
            myGlobalVars.passGo = true
            

            view.ignoresSiblingOrder = true
            view.showsFPS = true
            view.showsNodeCount = true
            view.showsPhysics = false


            
        }
    }

person Caractacus    schedule 13.10.2020    source источник


Ответы (1)


С другой доски кто-то сказал мне, что я запускаю GameScene из своего подпредставления, myView.

import UIKit
import SpriteKit
import GameplayKit

var myGlobalVars = GlobalVars(backGround: SKSpriteNode(),
                              pegHolder: SKSpriteNode(), currentNode: SKSpriteNode(),
                              widthPoints: 0.0, heightPoints: 0.0,
                              widthPixels: 0.0, heightPixels: 0.0, passGo: false, sceneRect: .zero, fileName: " ")

class GameViewController: UIViewController {

    private let myView : UIView = {
        let myView = UIView()
        myView.translatesAutoresizingMaskIntoConstraints = false
        myView.backgroundColor = .clear
        return myView
    }()
    
    private func addConstraints(){
        var constraints = [NSLayoutConstraint]()
        
        constraints.append(myView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor))
        constraints.append(myView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor))
        constraints.append(myView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor))
        constraints.append(myView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor))

        
        NSLayoutConstraint.activate(constraints)
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        let topSafeArea: CGFloat
        let bottomSafeArea: CGFloat

        if #available(iOS 11.0, *) {
            topSafeArea = view.safeAreaInsets.top
            bottomSafeArea = view.safeAreaInsets.bottom
        } else {
            topSafeArea = topLayoutGuide.length
            bottomSafeArea = bottomLayoutGuide.length
        }
    }

    let logo = UIImage(named: "startup")
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(myView)
        addConstraints()
        
        if let view = self.view as! SKView?
        {
            
            myGlobalVars.widthPixels = UIScreen.main.nativeBounds.width
            myGlobalVars.heightPixels = UIScreen.main.nativeBounds.height
            myGlobalVars.widthPoints = UIScreen.main.bounds.width
            myGlobalVars.heightPoints = UIScreen.main.bounds.height

            var scene : GameScene!
            DispatchQueue.main.async { [self] in
                     scene = GameScene(size: CGSize(width: myView.frame.width,
                                                       height: myView.frame.height))

            scene.anchorPoint = CGPoint(x: 0.0, y: 0.0)
                scene.backgroundColor = .clear
                scene.scaleMode = .aspectFit
                myGlobalVars.sceneRect = scene.frame
                myGlobalVars.gameScene = scene
                view.isHidden = false
                view.presentScene(scene)
            }
            myGlobalVars.passGo = true
            

            view.ignoresSiblingOrder = true
            view.showsFPS = true
            view.showsNodeCount = true
        }
    }
    
    override var shouldAutorotate: Bool {
        return false
    }

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

    override var prefersStatusBarHidden: Bool {
        return false
    }
}
person Caractacus    schedule 14.10.2020