Swift中如何在外部文件获取屏幕视图高度?
嘿,我明白你的困惑了——你想在另一个Swift类里获取整个屏幕的高度,而不是某个特定ViewController的view高度,直接通过类名访问MyViewController.view肯定不行,因为view是ViewController的实例属性,只有当ViewController被实例化后才能访问它的view相关属性。不过别担心,我们有更直接的方法,根本不需要依赖特定的ViewController:
方法1:获取屏幕的原始高度(包含状态栏、刘海等)
如果你需要的是屏幕的物理高度(不管上面的状态栏、刘海或者底部的Home Indicator),直接用UIScreen的API就可以:
let screenFullHeight = UIScreen.main.bounds.height
这个值是固定的,比如iPhone 14 Pro Max就是852pt,iPhone SE(第二代)是667pt,不会因为界面内容变化而改变。
方法2:获取安全区域内的可用高度(推荐)
如果你的需求是获取屏幕上实际可用于展示内容的高度(也就是去掉刘海、状态栏、底部Home Indicator后的高度),可以通过当前的主窗口来获取:
iOS 13及以上版本
从iOS 13开始,App可能有多个窗口,所以需要先获取当前的UIWindowScene:
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, let mainWindow = windowScene.windows.first { let safeAreaHeight = mainWindow.safeAreaLayoutGuide.layoutFrame.height }
iOS 12及以下版本
对于旧版本系统,可以直接访问keyWindow:
if let mainWindow = UIApplication.shared.keyWindow { let safeAreaHeight = mainWindow.safeAreaLayoutGuide.layoutFrame.height }
为什么直接访问MyViewController.view无效?
再补充一下你之前尝试的问题:MyViewController是类名,你直接用类名访问view相当于访问类属性,但view是ViewController的实例属性,必须要拿到MyViewController的一个实例对象(比如已经被创建并显示的那个)才能访问它的view.frame.height。不过既然你要的是屏幕高度,完全没必要绕这个弯,用上面的方法更简单可靠。
内容的提问来源于stack exchange,提问作者George_E -old

