Swift의 상태 표시 줄 높이


98

Swift에서 프로그래밍 방식으로 상태 표시 줄의 높이를 어떻게 얻을 수 있습니까?

Objective-C에서는 다음과 같습니다.

[UIApplication sharedApplication].statusBarFrame.size.height.

답변:


243

어떤 문제가 있습니까 스위프트 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
sizeSwift 3 에서는 생략 할 수 있습니다 UIApplication.shared.statusBarFrame.height.
joern

1
감사합니다. iPhone X의 오버플로 문제에 매우 도움이되었습니다
Mario Burga

let height = view.window? .windowScene? .statusBarManager? .statusBarFrame.height ?? 0은 실제로 0을 반환합니다
Invincible_Pain

@Invincible_Pain 아마도 현재 창이 아직로드되지 않았기 때문일 수 있으므로 다음으로 교체하십시오 view.window?.UIApplication.shared.keyWindow?
Karan Pal

5

Swift는 다른 언어 일뿐입니다. API 요소는 동일합니다. 아마도 다음과 같습니다.

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

5

iOS 13 이상 및 Swift 5 용 이전 iOS 버전을 지원하는 업데이트 된 답변

 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
}

행복한 코딩!


1
약간 조정하고 정적 변수로 만들면 액세스가 훨씬 더 명확 해집니다. UIApplication.statusBarHeight
Peter Suwara

실제로 전역 함수로 구현됩니다. 정적 var를 만드는 것이 클래스 내부에 래핑하면 편리합니다.
Md. Ibrahim Hassan

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

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

내 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.