iOS 上获取屏幕尺寸的正确方法,在 UIScreen.main 被弃用之后。

15

我一直使用UIScreen.main.bounds.size来获取iOS上的屏幕尺寸,目前运行得很好。

现在(可能是在iOS 16中),当我尝试使用“main”实例访问屏幕大小时,会显示警告:

"main' will be deprecated in a future version of iOS: Use a UIScreen instance found through context instead: i.e, view.window.windowScene.screen

那么我的问题是: 获取屏幕尺寸的正确方法是什么?为简单起见,让我们假设我们是在iPhone上,并且只有一个可用屏幕。谢谢


1
这篇文章可能会有所帮助:https://designcode.io/swiftui-handbook-detect-screen-size - wzso
3个回答

10
extension UIWindow {
    static var current: UIWindow? {
        for scene in UIApplication.shared.connectedScenes {
            guard let windowScene = scene as? UIWindowScene else { continue }
            for window in windowScene.windows {
                if window.isKeyWindow { return window }
            }
        }
        return nil
    }
}


extension UIScreen {
    static var current: UIScreen? {
        UIWindow.current?.screen
    }
}

这样,您可以在任何地方使用它,就像您可以使用 UIScreen.main 一样。

用法

UIScreen.current?.bounds.size

最佳答案脱颖而出。 - undefined

2

关于 UIScreen.main 废弃的 Apple 讨论:

Apple 不建议使用此符号。请改用通过上下文找到的 UIScreen 实例。例如,通过窗口场景上的屏幕属性引用显示视图的屏幕。

这里是一个通过上下文查找 UIScreen 实例的扩展:

extension UIViewController {
  func screen() -> UIScreen? {
    var parent = self.parent
    var lastParent = parent
    
    while parent != nil {
      lastParent = parent
      parent = parent!.parent
    }
    
    return lastParent?.view.window?.windowScene?.screen
  }
}

供参考,这是与SceneDelegate中的windowScene相关联的相同UIScreen实例:

  func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    guard let windowScene = (scene as? UIWindowScene) else { return }
    
    window = UIWindow(frame: windowScene.coordinateSpace.bounds)
    window?.windowScene = windowScene
    window?.rootViewController = ViewController()
    window?.makeKeyAndVisible()
    
    let screen = windowScene.screen
    
    configureNavigationBar()
  }

1

从一个 ViewController:

let screenSize = self.view.window?.windowScene?.screen.bounds.size

1
那么,这只是在您仍然使用旧的ViewController生命周期时的解决方案吗?谢谢! - Luca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接