ios - Swift 4.2 SafeAreaLayoutGuide 框架与 View Did Load 上的 view.frame 相同
问题描述
我正在使用安全区域布局指南,以编程方式(即)没有故事板。我想在我的应用程序中访问safeAreaLayoutGuides
, layoutFrame
size 但不知道何时调用它。如果您调用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)
}
}
解决方案
感谢米兰。我进行了实验并发现了以下内容:
`
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) // 有效
推荐阅读
- docker - Docker device-cgroups-rule、mknod 和 mount
- python - 未找到密钥时返回 None 的多级 dict
- python - 使用 Apache Beam 在 GCP DataflowRunner 上没有名为“IPython”的模块
- swift - SwiftUI @Published 仅在执行另一个“任务”后更新值
- google-sheets - Google 电子表格图表未正确从表格中提取信息
- python - 如何通过 API 调用从对象中提取信息?
- excel - 如何在 Excel 中使用 VBA 打印所有工作表?我的代码的行为不像我认为的那样
- python - 无法理解 csv.reader
- php - 准备好的语句 mysqli SELECT * FROM users
- python - 限制要删除的项目数 sqlite python