【问题标题】:Why does getting my view's frame return the full screen, even tho the view has been run through the safeArea constraints?为什么让我的视图的框架返回全屏,即使视图已经通过了 safeArea 约束?
【发布时间】:2020-12-02 21:34:15
【问题描述】:

在展示我的 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

【问题讨论】:

    标签: swift uiview uikit safearealayoutguide


    【解决方案1】:

    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)
        }
    

    【讨论】:

    • 这更接近,我得到了正确的尺寸。然而 DispatchQueue.main.async 返回这么晚,我将不得不找到一种方法来延迟 GameScene 的呈现,直到队列返回并传递数字。尚未解决,但到目前为止我最接近
    • 您的队列回答让我很接近。有时宽度会返回为零(我确实等待排队的代码完成),所以我必须确保仔细检查宽度。谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多