Chiều cao thanh trạng thái trong Swift


98

Làm cách nào để lấy chiều cao của thanh trạng thái theo lập trình trong Swift?

Trong Objective-C, nó như thế này:

[UIApplication sharedApplication].statusBarFrame.size.height.

Câu trả lời:


243

Có vấn đề gì với Swift 2.x không :

UIApplication.sharedApplication().statusBarFrame.size.height

Swift 3 hoặc Swift 4 :

UIApplication.shared.statusBarFrame.height

Đảm bảo UIKitđược nhập

import UIKit

Trong iOS 13, bạn sẽ nhận được cảnh báo không dùng nữa "

'statusBarFrame' không được dùng nữa trong iOS 13.0: Thay vào đó, hãy sử dụng thuộc tính statusBarManager của cảnh cửa sổ.

Để khắc phục điều này:

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

1
Cú pháp mới cho Swift 3:UIApplication.shared.statusBarFrame.size.height
DoK 4/10/16

4
Bạn có thể bỏ qua sizetrong Swift 3: UIApplication.shared.statusBarFrame.heightlà đủ.
joern

1
Cảm ơn, nó rất hữu ích cho sự cố tràn trên iPhone X
Mario Burga

let height = view.window? .windowScene? .statusBarManager? .statusBarFrame.height ?? 0 thực sự trả về 0
Invincible_Pain

@Invincible_Pain có thể là do cửa sổ hiện tại của bạn chưa được tải, vì vậy hãy thay thế view.window?bằngUIApplication.shared.keyWindow?
Karan Pal

5

Swift chỉ là một ngôn ngữ khác. Các phần tử API đều giống nhau. Có lẽ một cái gì đó như thế này:

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

5

Câu trả lời đã cập nhật Hỗ trợ iOS 13+ và các phiên bản iOS cũ hơn cho 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
}

Chúc bạn mã hóa vui vẻ!


1
Một chút tinh chỉnh, biến nó thành một var tĩnh, sau đó việc truy cập sẽ rõ ràng hơn nhiều. UIApplication.statusBarHeight
Peter Suwara

Nó thực sự được thực hiện như một chức năng toàn cục. Tạo một var tĩnh sẽ thuận tiện nếu tôi bọc nó bên trong một lớp.
Md. Ibrahim Hassan

4

Đây là những gì tôi sử dụng:

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

Sau đó, bạn có thể làm:

Screen.statusBarHeight


1

Câu trả lời được làm lại từ 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
    }
}

0

Trong dự án swiftUI của tôi, điều này đã hoạt động.

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
}

Khi sử dụng,

SceneDelegateDataGetter.shared.height
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.