我正在子类化
SKScene
以创建一个主菜单场景,并想在屏幕的左上角添加一个按钮。由于启用了状态栏,我希望将按钮放置在状态栏下方。为此,我需要安全区域插图,但每次我尝试访问安全区域插图时,我都会得到每条边的 0.0 值。
根据文档,当视图未出现在屏幕上时会发生这种情况,但是,我无法找到在视图出现后访问安全区域插图的方法。
sceneDidLoad()
、didMove(to:)
等似乎都在 viewDidAppear()
之前被调用,所以我无法从这些函数中获取安全区域插图。
谁能告诉我如何使用
safeAreaInsets
将我的SKSpriteNodes(菜单按钮)放在安全区域内?请记住,我需要在 SKScene 子类中访问它,这样我才能正确放置我的菜单按钮。
提前致谢。
以前很容易从内部访问插图
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()
}
}