ความสูงของแถบสถานะใน Swift


101

ฉันจะรับความสูงของแถบสถานะโดยใช้โปรแกรมใน Swift ได้อย่างไร

ใน Objective-C จะเป็นเช่นนี้:

[UIApplication sharedApplication].statusBarFrame.size.height.

คำตอบ:


246

มีปัญหากับSwift 2.x หรือไม่ :

UIApplication.sharedApplication().statusBarFrame.size.height

Swift 3 หรือ Swift 4 :

UIApplication.shared.statusBarFrame.height

ตรวจสอบให้แน่ใจว่าUIKitได้นำเข้า

import UIKit

ใน iOS 13 คุณจะได้รับคำเตือนว่าเลิกใช้งาน "

'statusBarFrame' เลิกใช้งานแล้วใน iOS 13.0: ใช้คุณสมบัติ statusBarManager ของฉากหน้าต่างแทน

วิธีแก้ไข:

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

1
ไวยากรณ์ใหม่สำหรับ Swift 3:UIApplication.shared.statusBarFrame.size.height
DoK

4
คุณสามารถละเว้นsizeใน Swift 3: UIApplication.shared.statusBarFrame.heightก็เพียงพอแล้ว
joern

1
ขอบคุณมันมีประโยชน์มากสำหรับปัญหาล้นบน iPhone X
Mario Burga

ให้ height = view.window? .windowScene? .statusBarManager? .statusBarFrame.height ?? 0 กำลังส่งคืน 0 จริง
Invincible_Pain

@Invincible_Pain อาจเป็นเพราะหน้าต่างปัจจุบันของคุณยังไม่ได้โหลดดังนั้นให้แทนที่view.window?ด้วยUIApplication.shared.keyWindow?
Karan Pal

9

คำตอบที่อัปเดตรองรับ iOS 13+ และ iOS เวอร์ชันเก่ากว่าสำหรับ 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
}

Happy Coding!


1
ปรับแต่งเล็กน้อยทำให้เป็น var แบบคงที่จากนั้นการเข้าถึงจะชัดเจนกว่ามากเช่น UIApplication.statusBarHeight
Peter Suwara

1
มีการนำไปใช้งานจริงเป็นฟังก์ชันระดับโลก การสร้างตัวแปรแบบคงที่จะสะดวกถ้าฉันรวมไว้ในคลาส
Md. Ibrahim Hassan

5

Swift เป็นเพียงภาษาอื่น องค์ประกอบ API เหมือนกัน อาจจะเป็นเช่นนี้:

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

4

นี่คือสิ่งที่ฉันใช้:

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

จากนั้นคุณสามารถทำได้:

Screen.statusBarHeight


1

ทำใหม่คำตอบจากอิบราฮิม:

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 ของฉันสิ่งนี้ได้ผล

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
}

เมื่อใช้งาน

SceneDelegateDataGetter.shared.height
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.