Altura de la barra de estado en Swift


98

¿Cómo puedo obtener la altura de la barra de estado mediante programación en Swift?

En Objective-C, es así:

[UIApplication sharedApplication].statusBarFrame.size.height.

Respuestas:


243

¿Hay algún problema con Swift 2.x ?

UIApplication.sharedApplication().statusBarFrame.size.height

Swift 3 o Swift 4 :

UIApplication.shared.statusBarFrame.height

Asegúrate de que UIKitsea ​​importado

import UIKit

En iOS 13, recibirá una advertencia obsoleta "

'statusBarFrame' quedó obsoleto en iOS 13.0: utilice la propiedad statusBarManager de la escena de la ventana en su lugar.

Para arreglar esto:

let height = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0

1
Nueva sintaxis para Swift 3:UIApplication.shared.statusBarFrame.size.height
— DoK

4
Puede omitir sizeen Swift 3: UIApplication.shared.statusBarFrame.heightes suficiente.
— joern

1
Gracias, fue muy útil para un problema de desbordamiento en el iPhone X
— Mario Burga

let height = view.window? .windowScene? .statusBarManager? .statusBarFrame.height ?? 0 está devolviendo 0 en realidad
— Invincible_Pain

@Invincible_Pain probablemente se deba a que su ventana actual aún no se ha cargado, así que reemplácela view.window?conUIApplication.shared.keyWindow?
— Karan Pal

5

Swift es solo un idioma diferente. Los elementos de la API son los mismos. Quizás algo como esto:

let app = UIApplication.sharedApplication()
let height = app.statusBarFrame.size.height

5

Respuesta actualizada compatible con iOS 13+ y versiones anteriores de iOS para Swift 5

 func getStatusBarHeight() -> CGFloat {
    var statusBarHeight: CGFloat = 0
    if #available(iOS 13.0, *) {
        let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
        statusBarHeight = window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
    } else {
        statusBarHeight = UIApplication.shared.statusBarFrame.height
    }
    return statusBarHeight
}

¡Feliz codificación!


1
Un pequeño ajuste, conviértalo en una var estática, entonces el acceso es mucho más claro, es decir. UIApplication.statusBarHeight
— Peter Suwara

En realidad, se implementa como una función global. Hacer una var estática sería conveniente si la envuelvo dentro de una clase.
— Md. Ibrahim Hassan

4

Esto es lo que uso:

struct Screen {
    static var width: CGFloat {
        return UIScreen.main.bounds.width
    }
    static var height: CGFloat {
        return UIScreen.main.bounds.height
    }
    static var statusBarHeight: CGFloat {
        return UIApplication.shared.statusBarFrame.size.height
    }
}

Entonces puedes hacer:

Screen.statusBarHeight


1

Respuesta reelaborada de Ibrahim:

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

0

En mi proyecto swiftUI, esto funcionó.

import UIKit
import SwiftUI

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    
    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        let contentView = ContentView()
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            
            if let statusBarHeight = window.windowScene?.statusBarManager?.statusBarFrame.height {
            SceneDelegateDataGetter.shared.height = statusBarHeight
            }
            
            window.rootViewController = HostingController(rootView: contentView)
            self.window = window
            window.makeKeyAndVisible()
        }
    }

class SceneDelegateDataGetter {
    static let shared = SceneDelegateDataGetter()
    
    public fileprivate(set) var height: CGFloat = 0
}

Cuando se usa,

SceneDelegateDataGetter.shared.height
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.