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 的逻辑略有错误?
SwiftUI:为啥proxy.safeAreaInsets.bottom的高度等于keyboardHeight?