如何解决为什么即使视图已通过safeArea约束,但为什么仍使我的视图的框架返回全屏显示?
在展示我的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)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。