首页 > 解决方案 > Swift 4.2 SafeAreaLayoutGuide 框架与 View Did Load 上的 view.frame 相同

问题描述

我正在使用安全区域布局指南,以编程方式(即)没有故事板。我想在我的应用程序中访问safeAreaLayoutGuides, layoutFramesize 但不知道何时调用它。如果您调用viewDidLoad,则返回的大小与完整的大小相同view.frame size。应用程序什么时候赶上并重新调整?我的完整应用程序在一个menubarcontroller. 第一个屏幕加载的内容限制view.topAnchor在我激活时view.safeAreaLayoutGuide.topAnchor。如果您切换到另一个选项卡/屏幕,则该屏幕没问题,当您返回第一个时,布局已自行更正。在一个基本示例中,我添加了一个按钮,该按钮在视图加载后打印帧大小并返回正确的大小。我不希望我的用户必须按下按钮才能正确加载视图。

class ViewController: UIViewController {

    override func viewDidLoad() {

        super.viewDidLoad()

        print(view.frame) // Returns (0.0, 0.0, 375.0, 812.0)
        print(view.safeAreaLayoutGuide.layoutFrame) // Returns (0.0, 0.0, 375.0, 812.0)

    }

    @IBAction func button(_ sender: Any) {

        print(view.frame) // Returns (0.0, 0.0, 375.0, 812.0)
        print(view.safeAreaLayoutGuide.layoutFrame) // Returns (0.0, 44.0, 375.0, 734.0)

    }
}

标签: iosswift4ios-autolayoutxcode10safearealayoutguide

解决方案


感谢米兰。我进行了实验并发现了以下内容:

`

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    print("ViewWillLayout: \(view.safeAreaLayoutGuide.layoutFrame)")
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(true)
    print("ViewDidAppear \(view.safeAreaLayoutGuide.layoutFrame)")
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    print("ViewDidLayoutSubviews \(view.safeAreaLayoutGuide.layoutFrame)")
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    print("ViewWillAppear \(view.safeAreaLayoutGuide.layoutFrame)")
}`

来自控制台的结果

  • View.Frame size: (0.0, 0.0, 375.0, 812.0) // 帧大小
  • ViewDidLoad: (0.0, 0.0, 375.0, 812.0) // 与帧大小相同
  • ViewWillAppear (0.0, 0.0, 375.0, 812.0) // 与帧大小相同
  • ViewWillLayout: (0.0, 88.0, 375.0, 690.0) // 有效
  • ViewDidLayoutSubviews (0.0, 88.0, 375.0, 690.0) // 有效
  • ViewDidAppear (0.0, 88.0, 375.0, 690.0) // 有效

推荐阅读