Swift'de durum çubuğu yüksekliği


99

Swift'de durum çubuğunun yüksekliğini programlı olarak nasıl alabilirim?

Objective-C'de bu şöyle:

[UIApplication sharedApplication].statusBarFrame.size.height.

Yanıtlar:


245

Swift 2.x ile ilgili herhangi bir sorun var mı :

UIApplication.sharedApplication().statusBarFrame.size.height

Swift 3 veya Swift 4 :

UIApplication.shared.statusBarFrame.height

UIKitİçe aktarıldığından emin olun

import UIKit

İOS 13'te kullanımdan kaldırılmış bir uyarı alacaksınız "

iOS 13.0'da 'statusBarFrame' kullanımdan kaldırıldı: Bunun yerine pencere sahnesinin statusBarManager özelliğini kullanın.

Bunu düzeltmek için:

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

1
Swift 3 için yeni sözdizimi:UIApplication.shared.statusBarFrame.size.height
DoK

4
sizeSwift 3'te ihmal edebilirsiniz : UIApplication.shared.statusBarFrame.heightyeterlidir.
joern

1
Teşekkürler, iPhone X'de bir taşma sorunu için çok yardımcı oldu
Mario Burga

let height = view.window? .windowScene? .statusBarManager? .statusBarFrame.height ?? 0 aslında 0 döndürüyor
Invincible_Pain

Böylece yerine, mevcut pencere henüz yüklenmediği çünkü muhtemelen @Invincible_Pain view.window?ileUIApplication.shared.keyWindow?
Karan Pal

5

Swift sadece farklı bir dil. API öğeleri aynıdır. Belki bunun gibi bir şey:

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

5

Swift 5 için iOS 13+ ve daha eski iOS Sürümlerini Destekleyen Güncellenmiş Cevap

 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
}

Mutlu Kodlama!


1
Biraz ince ayar yapın, onu statik bir değişken yapın, sonra erişim çok daha nettir, yani. UIApplication.statusBarHeight
Peter Suwara

Aslında küresel bir işlev olarak uygulanır. Statik bir değişken oluşturmak, onu bir sınıfın içine koyarsam uygun olur.
Md. İbrahim Hassan

4

Kullandığım şey bu:

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

O zaman şunları yapabilirsiniz:

Screen.statusBarHeight


1

İbrahim'in cevabı yeniden düzenlendi:

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

SwiftUI projemde bu işe yaradı.

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
}

Kullanıldığında,

SceneDelegateDataGetter.shared.height
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.