Tinggi bilah status di Swift

98

Bagaimana saya bisa mendapatkan tinggi status bar secara terprogram di Swift?

Di Objective-C, ini seperti ini:

[UIApplication sharedApplication].statusBarFrame.size.height.
Oleshko
sumber

Jawaban:

243

Apakah ada masalah dengan Swift 2.x :

UIApplication.sharedApplication().statusBarFrame.size.height

Swift 3 atau Swift 4 :

UIApplication.shared.statusBarFrame.height

Pastikan UIKitdiimpor

import UIKit

Di iOS 13, Anda akan mendapatkan peringatan yang tidak berlaku lagi "

'statusBarFrame' tidak digunakan lagi di iOS 13.0: Gunakan properti statusBarManager dari adegan jendela sebagai gantinya.

Untuk mengatasinya:

let height = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
Kirstein
sumber
1
Sintaks baru untuk Swift 3:UIApplication.shared.statusBarFrame.size.height
DoK
4
Anda dapat menghilangkan sizedi Swift 3: UIApplication.shared.statusBarFrame.heightsudah cukup.
joern
1
Terima kasih, itu sangat membantu untuk masalah overflow pada iPhone X
Mario Burga
biarkan height = view.window? .windowScene? .statusBarManager? .statusBarFrame.height ?? 0 sebenarnya kembali 0
Invincible_Pain
@Invincible_Pain itu mungkin karena jendela Anda saat ini belum dimuat, jadi ganti view.window?denganUIApplication.shared.keyWindow?
Karan Pal
5

Swift hanyalah bahasa yang berbeda. Elemen API sama. Mungkin sesuatu seperti ini:

let app = UIApplication.sharedApplication()
let height = app.statusBarFrame.size.height
vcsjones.dll
sumber
5

Jawaban yang Diperbarui Mendukung iOS 13+ dan Versi iOS yang lebih lama untuk 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
}

Selamat Coding!

Md. Ibrahim Hassan
sumber
1
Sedikit tweak, jadikan sebagai var statis, maka aksesnya jauh lebih jelas yaitu. UIApplication.statusBarHeight
Peter Suwara
Ini sebenarnya diimplementasikan sebagai fungsi global. Membuat var statis akan lebih mudah jika saya membungkusnya di dalam kelas.
Md. Ibrahim Hassan
4

Ini yang saya gunakan:

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
    }
}

Kemudian Anda dapat melakukan:

Screen.statusBarHeight
Polisi
sumber
1

Jawaban ulang dari 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
    }
}
Peter Suwara
sumber
0

Pada proyek swiftUI saya, ini berhasil.

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
}

Saat digunakan,

SceneDelegateDataGetter.shared.height
holahola
sumber