ฉันจะรับความสูงของแถบสถานะโดยใช้โปรแกรมใน Swift ได้อย่างไร
ใน Objective-C จะเป็นเช่นนี้:
[UIApplication sharedApplication].statusBarFrame.size.height.
ฉันจะรับความสูงของแถบสถานะโดยใช้โปรแกรมใน Swift ได้อย่างไร
ใน Objective-C จะเป็นเช่นนี้:
[UIApplication sharedApplication].statusBarFrame.size.height.
คำตอบ:
มีปัญหากับ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
sizeใน Swift 3: UIApplication.shared.statusBarFrame.heightก็เพียงพอแล้ว
                    view.window?ด้วยUIApplication.shared.keyWindow?
                    คำตอบที่อัปเดตรองรับ 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!
Swift เป็นเพียงภาษาอื่น องค์ประกอบ API เหมือนกัน อาจจะเป็นเช่นนี้:
let app = UIApplication.sharedApplication()
let height = app.statusBarFrame.size.height
นี่คือสิ่งที่ฉันใช้:
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
มันเหมือนกับ Objective-C:
var screenStatusBarHeight: CGFloat {
    return UIApplication.sharedApplication().statusBarFrame.height
}
สิ่งนี้รวมเป็นตัวแปรมาตรฐานใน:
ทำใหม่คำตอบจากอิบราฮิม:
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
    }
}
ในโครงการ 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
UIApplication.shared.statusBarFrame.size.height