问题描述
在展示我的GameScene之前,我将safeAreaLayoutGuide应用于初始视图屏幕(以下代码来自GameViewController)。
如果在致电之前的任何时候 view.presentScene(scene)
,如果我尝试获取视图的框架,则会得到一个空集。
但是,如果我得到了框架,则在呈现场景后 ,即使视图确实出现在safeAreaLayoutGuide中,我也获得了全屏显示。
如何获取视图的安全调整后的屏幕坐标? 我应该注意,我这样做是为了对GameScene应用适当的约束,因为我只能找到针对UIView的方法。
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let view = self.view as! SKView?{
let screenWidthInPoints = UIScreen.main.bounds.width
let screenHeightInPoints = UIScreen.main.bounds.height
let imageView = UIView()
imageView.backgroundColor = .red
view.addSubview(imageView)
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor).isActive = true
imageView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor,constant: 0).isActive = true
imageView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor).isActive = true
imageView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor,constant: -0).isActive = true
let scene = GameScene(size: CGSize(width: screenWidthInPoints,height: screenHeightInPoints))
scene.backgroundColor = .black
scene.scaleMode = .aspectFit
view.presentScene(scene)
var myRect = view.frame
解决方法
UIScreen.main.bounds
代表整个屏幕,而不仅仅是安全区域。您将必须创建一个限制于安全区域插图的单独视图,以获取正确的安全区域大小。就您而言,您已经在安全区域内放置了imageView
。添加约束后,尝试打印出其大小,并在DispatchQueue.main.async
中进行操作,以确保仅在当前通道布局完成后才调用它。
let imageView = UIView()
imageView.backgroundColor = .red
view.addSubview(imageView)
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor).isActive = true
imageView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor,constant: 0).isActive = true
imageView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor).isActive = true
imageView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor,constant: -0).isActive = true
DispatchQueue.main.async {
print("imageView.frame: ",imageView.frame)
let scene = GameScene(size: CGSize(width: imageView.frame.width,height: imageView.frame.height))
scene.backgroundColor = .black
scene.scaleMode = .aspectFit
view.presentScene(scene)
}