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.