safeAreaInsets SpriteKit中的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了safeAreaInsets SpriteKit中的问题相关的知识,希望对你有一定的参考价值。

我正在开发游戏,现在我注意到它看起来并不像我在iPhone X上所期望的那样。我需要的是在top right corner上放置一个标签,在iPhone X上标签根本没有显示。所以我读到了Safe Area并提出了这个解决方案:

GameViewController:

override func viewDidLoad() {
    super.viewDidLoad()

    self.view.setNeedsLayout()
    self.view.layoutIfNeeded()
    self.view.layoutSubviews()
}

override func viewDidLayoutSubviews() {
    print("viewDidLayoutSubviews")
    print(self.view.safeAreaInsets.top)
    print(self.view.safeAreaInsets.bottom)
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    let scene = GameScene(size: view.bounds.size)
    let skView = view as! SKView
    skView.showsFPS = false
    skView.showsNodeCount = false
    scene.scaleMode = .resizeFill
    skView.presentScene(scene)
}

在我的GameScene中,我在用户时这样做

override func didMove(to view: SKView) {
    var label = SKLabelNode()
    if let safeAreaInsets = self.view?.safeAreaInsets {
        var y: CGFloat = 0.0
        if safeAreaInsets.top == 0.0 { iPhone SE, 6/7/8, Plus
            y = self.frame.height - 10
        } else { // iPhone X
            y = frame.maxY - safeAreaInsets.top - 5
        }
        label.position = CGPoint(x: self.frame.width -100, y: y)
    }

    label.text = "Highscore: 0"
    label.zPosition = 5
}

Two questions on this:

1:

这是有效的,但我真的需要检查safeAreaInsets.top == 0.0检测我是否需要使用safeAreaInsets for iPhone X?这两个手机的安全区域不应该相同吗?

2:为了能够获得safeAreaInsets我需要调用self.view.setNeedsLayout(), self.view.layoutIfNeeded(), self.view.layoutSubviews()(可能不是全部,但其中一些)。如果我不使用这个,所有safeAreaInsets总是0.0。为什么是这样?

答案

您可以使用:

if #available(ios 11.0, *) {
    if let window = UIApplication.shared.keyWindow {
        let safeAreaBottom = window.safeAreaInsets.bottom
        let safeAreaLeft = window.safeAreaInsets.left
        let safeAreaRight = window.safeAreaInsets.right
        let safeAreaTop = window.safeAreaInsets.top
    }

}

以上是关于safeAreaInsets SpriteKit中的问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥 `viewWillTransitionToSize` 中检索 SafeAreaInsets 的逻辑略有错误?

是否可以将 safeAreaInsets 更改为自定义值?

SwiftUI:为啥proxy.safeAreaInsets.bottom的高度等于keyboardHeight?

当 View.OnAppearing 被触发时 SafeAreaInsets 为 0

safeAreaInsets 未按预期更新

Xamarin Forms - 状态栏与 IOS 中的内容重叠(safeareainsets 问题)