如何从 SKScene 子类中获取安全区域插图

问题描述 投票:0回答:1

我正在子类化

SKScene
以创建一个主菜单场景,并想在屏幕的左上角添加一个按钮。由于启用了状态栏,我希望将按钮放置在状态栏下方。为此,我需要安全区域插图,但每次我尝试访问安全区域插图时,我都会得到每条边的 0.0 值。

根据文档,当视图未出现在屏幕上时会发生这种情况,但是,我无法找到在视图出现后访问安全区域插图的方法。

sceneDidLoad()
didMove(to:)
等似乎都在
viewDidAppear()
之前被调用,所以我无法从这些函数中获取安全区域插图。

谁能告诉我如何使用

safeAreaInsets
将我的SKSpriteNodes(菜单按钮)放在安全区域内?请记住,我需要在 SKScene 子类中访问它,这样我才能正确放置我的菜单按钮。

提前致谢。

ios swift layout sprite-kit safearea
1个回答
0
投票

以前很容易从内部访问插图

SKScene

UIApplication.shared.windows.first?.safeAreaInsets

'windows' 在 iOS 15.0 中被弃用。但是你仍然可以像这样访问插图

self.view?.window?.windowScene?.windows.first?.safeAreaInsets

但是,正如您所说,这在 SKScene 的启动周期内不起作用。你必须访问它之后.

作为解决方案,我推荐以下模式:将所有 SKNode 定位集中到一个函数中 叫

rebuild
。在该重建函数开始时,还会更新 safeAreaInsets。然后从
UIViewController.viewDidAppear

调用重建

SK场景:

var topInset:CGFloat = 0

func pollInsets() {
     topInset = self.view?.window?.windowScene?.windows.first?.safeAreaInsets.top ?? 0
     print("topInset: \(topInset)")
}

func rebuild() {
     pollInsets()
     
     //reposition your buttons, etc.
}

UIViewController:

override func viewDidAppear(_ animated: Bool) {
     if let view = self.view as! SKView? {
          (view.scene as? GameScene)?.rebuild()
     }
}
© www.soinside.com 2019 - 2024. All rights reserved.