web-dev-qa-db-fra.com

Comment obtenir la hauteur de la barre d'état dans iOS 13?

Dans iOS 13 UIApplication.shared.statusBarFrame.height met en garde

'statusBarFrame' est obsolète dans iOS 13.0: utilisez plutôt la propriété statusBarManager de la scène de la fenêtre.

Comment obtenir la hauteur de la barre d'état sans utiliser une API obsolète dans iOS 13?

20
Jordan H

Solution:

Cela semble également fonctionner sans avertissement sur les appareils iPhoneX +.

Swift 4.2/5

if #available(iOS 13.0, *) {
    let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
    lar statusBarHeight = window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
} else {
    statusBarHeight = UIApplication.shared.statusBarFrame.height
}

Essayez-le. J'espère que ça aide.

0
var statusBarHeight: CGFloat = 0
if #available(iOS 13.0, *) {
    statusBarHeight = UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
} else {
    statusBarHeight = UIApplication.shared.statusBarFrame.height
}
0
Andrew Bell

pour iOS 13:

dans votre SceneDelegate:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
 if let windowScene = scene as? UIWindowScene {
    let window = UIWindow(windowScene: windowScene)
    let statusBarSize = windowScene.statusBarManager!.statusBarFrame
    ...// initialize your root view controller
 }
}

et si vous souhaitez transmettre la valeur à vos Views, vous pouvez définir la valeur comme Environment et l'utiliser dans vos Views. exemple:

nous devons d'abord créer notre clé d'environnement:

struct StatusBarSizeEnvironmentKey: EnvironmentKey {
   public static let defaultValue: CGRect = CGRect()
}

extension EnvironmentValues {
  public var statusBarSize: CGRect {
    set { self[StatusBarSizeEnvironmentKey.self] = newValue }
    get { self[StatusBarSizeEnvironmentKey] }
  }
}

et définissez la valeur dans SceneDelegate:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
 if let windowScene = scene as? UIWindowScene {
    let window = UIWindow(windowScene: windowScene)
    let statusBarSize = windowScene.statusBarManager!.statusBarFrame
    window.rootViewController = UIHostingController(rootView: YourView()
             .environment(\.statusBarSize, statusBarSize))
 }
}
0