프로그래밍 방식으로 iOS 상태 표시 줄 높이를 얻는 방법


277

현재 iPhone / iPad 상단의 상태 표시 줄 (시간, 배터리 및 네트워크 연결 포함)은 망막이 아닌 화면의 경우 20 픽셀이고 망막 화면의 경우 40 픽셀입니다.하지만 나중에 내 앱을 증명하고 싶습니다. 하드 코딩 값없이이를 확인할 수 있습니다. 프로그래밍 방식으로 상태 표시 줄의 높이를 파악할 수 있습니까?

답변:


506

[UIApplication sharedApplication].statusBarFrame.size.height. 그러나 모든 크기는 픽셀이 아닌 포인트 단위이므로 상태 표시 줄 높이는 항상 20입니다.

최신 정보. 이 답변이 도움이되었다고 판단되면 자세히 설명해야합니다.

상태 막대 높이는 실제로 다음과 같은 경우를 제외하고 20.0f 포인트와 같습니다 .

  • 상태 표시 줄은 setStatusBarHidden:withAnimation:방법 으로 숨겨졌으며 높이는 0.0f 포인트와 같습니다.
  • 여기서 @Anton이 지적했듯이 전화 응용 프로그램 외부에서 전화를 받거나 녹음 세션 상태 표시 줄 높이가 40.0f 포인트와 같습니다.

또한 뷰 높이에 영향을주는 상태 표시 줄이 있습니다. 일반적으로 뷰의 높이는 주어진 방향에서 상태 막대 높이를 뺀 화면 크기와 같습니다. 그러나 뷰가 표시된 후 상태 표시 줄에 애니메이션을 표시하거나 (표시하거나 숨기면) 상태 표시 줄이 프레임을 변경하지만 뷰 가 변경되지 않는 경우 상태 표시 줄 애니메이션 이후 (또는 이후 애니메이션 중 상태 표시 줄 높이는 애니메이션 시작시 최종 값으로 설정됩니다.

업데이트 2. 사용자 인터페이스 방향도 있습니다. 상태 표시 줄은 방향 값에 따라서 상태 표시 줄의 높이 값을 존중하지 않는 세로 모드 인 [UIApplication sharedApplication].statusBarFrame.size.height을위한, (예, 기본 방향은 항상 세로, 앱의 Info.plist 말한다 상관없이입니다) 풍경 - [UIApplication sharedApplication].statusBarFrame.size.width. 외부에 UIViewController있고 self.interfaceOrientation사용할 수 없을 때 UI의 현재 방향을 확인하려면을 사용하십시오 [UIApplication sharedApplication].statusBarOrientation.

iOS7 용 업데이트. 상태 표시 줄 비주얼 스타일이 변경되었지만 여전히 존재하지만 프레임은 여전히 ​​동일하게 작동합니다. 내가 얻은 상태 표시 줄에 대한 유일한 흥미로운 발견 – 공유 : 귀하 UINavigationBar타일 배경은 상태 표시 줄에 바둑판 식으로 배치되어 흥미로운 디자인 효과를 얻거나 상태 표시 줄에 색상을 지정할 수 있습니다. 이것도 어떤 식 으로든 상태 표시 줄 높이에 영향을 미치지 않습니다.

탐색 모음 바둑판 식 배경은 상태 표시 줄에도 바둑판 식으로 배열됩니다


6
이 방법은 1024 (iOS7)를 생성합니다
Marc

1
@MarcMosby, 내 업데이트를 참조하십시오. 이 문제를 기억했습니다. 감사합니다.
Kyr Dunenkoff

2
예, Marc가 iOS7에서 지적했듯이 때로는 1024를, 때로는 20을 예일합니다. 따라서 이것은 더 이상 키를 결정하는 바보 같은 방법이 아닙니다. iOS 7의 상태 표시 줄이 투명하기 때문에 이것이 의심 스럽습니다. 먼저 전체 화면으로 이동 한 다음 자체 크기를 조정합니다. 따라서이 전환 중에 앱 쿼리를 사용하면 잘못된 값을 얻을 수 있습니다. 지연으로이 메소드를 호출하면 iOS 7에서 도움이 될 수 있습니다.
Deepak GM

1
상태 표시 줄 높이가 0 일 수있는 경우가 있습니다. supportedInterfaceOrientations ()가 UIInterfaceOrientationMask 대신 UIInterfaceOrientation (잘못된 결과이지만 컴파일러 오류는 없음)을 반환하고 뷰 컨트롤러가 표시되고 닫히면 상태 표시 줄 높이가 0이됩니다.
Cymric

5
또한 iPhone X 상태 표시 줄이 더 높습니다.
사전

98

질문에 대한 Martin의 제안 과 함께 하십시오 : iPhone Status Bar Height 가져 오기 .

CGFloat AACStatusBarHeight()
{
    CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
    return MIN(statusBarSize.width, statusBarSize.height);
}

그리고 스위프트에서

func statusBarHeight() -> CGFloat {
    let statusBarSize = UIApplication.shared.statusBarFrame.size
    return Swift.min(statusBarSize.width, statusBarSize.height)
}

해킹처럼 보이지만 실제로는 매우 견고합니다. 어쨌든, 그것은 유일한 작동 솔루션입니다.

기존 답변

의 사용자 정의 하위 클래스로 이동하는 다음 코드는 UIViewController거의 가로 방향을 지원하기 위해 작동했습니다. 그러나, 나는 작동하지 않는 코너 케이스 (오른쪽에서 회전 할 때> 거꾸로 된 왼쪽> 왼쪽)를 보았습니다.

BOOL isPortrait = self.interfaceOrientation == UIInterfaceOrientationPortrait;
CGSize statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;
CGFloat statusBarHeight = (isPortrait ? statusBarSize.height : statusBarSize.width);

이것은 정확하지 않습니다. 장치를 회전해도 상태 표시 줄의 높이는 변경되지 않습니다. 너비는 가능하지만 위의 코드는 그것을 나타내지 않으며 원래의 질문도 아닙니다.
lehn0058

1
"장치를 회전 할 때 상태 표시 줄의 높이가 변경되지 않습니다." 그러나 Ash가 대답했듯이 "가로 모드에서 너비와 높이가 바뀌는 것을 알 수 있습니다." 위의 코드는이를 고려합니다.
ma11hew28

이것은 내가 지금도 본 흥미로운 문제입니다. 그것은 애플 측의 버그처럼 보이지만 여전히 고려해야합니다.
lehn0058

2
@ lehn0058 버그가 아닙니다. Apple이 내부적으로 막대를 처리하는 방식입니다. 창에 연결되고 해당 창은 변환을 사용하여 회전됩니다. 이 statusBarFrame변환 전의 값으로 반환됩니다.
레오 나탄

1
그것은 재산으로 더 좋아 보인다 : Dvar statusBarHeight: CGFloat
Pablo A.

23

이 시도:

CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;

1
다른 방향으로 반환되는 높이가 다릅니다. 이상하다
tGilani

1
예, 회전이 가로 방향 인 경우 [[UIApplication sharedApplication] statusBarFrame] .size.height 및 [[UIApplication sharedApplication] statusBarFrame] .size.width 값이 전환됩니다.
Guntis Treulands

21

스위프트 3 또는 스위프트 4 :

UIApplication.shared.statusBarFrame.height

10

상태 표시 줄은 일반적으로 키가 20pt이지만 일부 상황에서는 두 배가 될 수 있습니다.

  • 전화 통화 중일 때 (일반적인 시나리오 임);
  • 보이스 레코더 또는 Skype 또는 유사한 앱이 백그라운드에서 마이크를 사용하는 경우
  • 개인용 핫스팟이 활성화 된 경우;

그냥 해보면 직접 볼 수 있습니다. 높이를 20pt로 하드 코딩하면 일반적으로 작동하지 않을 때까지 작동합니다.

그래서 나는 두 번째 H2CO3의 대답 :

statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;

10

편집 보기 컨텐츠의 맨 위에 놓을 위치를 결정하는 iOS 11 방법은 UIView의 safeAreaLayoutGuideSee UIView Documentation 입니다.

더 이상 사용되지 않는 답변 iOS 7 이상을 대상으로하는 경우, UIViewController에 대한 설명서는 viewController의 topLayoutGuide속성이 상태 표시 줄의 하단 또는 탐색 표시 줄의 하단 (표시된 경우)을 제공하도록 권장합니다. 그것은 사용 중일 수 있으며, 이전의 많은 솔루션보다 확실히 해킹이 적습니다.


5

상태 표시 줄의 프레임이 화면의 좌표 공간에 있다는 것을 잊지 마십시오! 가로 모드로 시작하면 너비와 높이가 바뀌는 것을 알 수 있습니다. 가로 방향을 지원하는 경우 대신이 버전의 코드를 사용하는 것이 좋습니다.

CGRect statusBarFrame = [self.window convertRect:[UIApplication sharedApplication].statusBarFrame toView:view];

그런 다음 statusBarFrame의 height 속성을 직접 읽을 수 있습니다. 이 예에서 '보기'는 측정을 사용하려는보기 여야하며, 응용 프로그램 창의 루트보기 컨트롤러 일 가능성이 높습니다.

또한 전화 통화 중 상태 표시 줄이 더 커질뿐만 아니라 상태 표시 줄이 의도적으로 숨겨져 있으면 0이 될 수도 있습니다.


이것은 나에게 올바른 높이를주지 못했습니다. 그러나 나를 위해 일한 다른 방법을 찾았습니다. stackoverflow.com/a/16598350/242933
ma11hew28

예, 이것은 꽤 오래된 코드이므로 더 이상 유효한 대답은 아닙니다. 개인적으로 더 이상 자동 레이아웃 덕분에 상태 표시 줄의 높이를 확인할 필요가 없습니다.
Ash


2

iOS 13의 경우 다음을 사용할 수 있습니다.

UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height

1
    var statusHeight: CGFloat!
    if #available(iOS 13.0, *) {
         statusHeight = UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height
    } else {
        // Fallback on earlier versions
        statusHeight = UIApplication.shared.statusBarFrame.height
    }


0

방금 상태 표시 줄 높이에 직접 액세스 할 수는 없지만 계산하는 방법을 찾았습니다.

탐색 막대 높이-topLayoutGuide 길이 = 상태 표시 줄 높이

빠른:

let statusBarHeight = self.topLayoutGuide.length-self.navigationController?.navigationBar.frame.height

self.topLayoutGuide.length반투명 막대로 덮여있는 상단 영역이며 self.navigationController?.navigationBar.frame.height상태 막대를 제외한 반투명 막대이며 일반적으로 44pt입니다. 따라서이 방법을 사용하면 전화 통화로 인한 상태 표시 줄 높이 변경에 대한 걱정없이 상태 표시 줄 높이를 쉽게 계산할 수 있습니다.


작동하지 않습니다. self.topLayoutGuide.length0이므로 결과는 -44입니다.
nambatee

@nambatee iOS 11이기 때문에 더 이상 작동하지 않는다고 생각합니다. Apple은 safeAreaInsets를 사용합니다
Henry Ngan


-6

다음 한 줄 코드를 사용하면 상태 표시 줄 높이를 모든 방향에서 볼 수 있는지 여부를 알 수 있습니다

#define STATUS_BAR_HIGHT (
    [UIApplicationsharedApplication].statusBarHidden ? 0 : (
        [UIApplicationsharedApplication].statusBarFrame.size.height > 100 ?
            [UIApplicationsharedApplication].statusBarFrame.size.width :
            [UIApplicationsharedApplication].statusBarFrame.size.height
    )
)

간단하지만 매우 유용한 매크로입니다. 추가 코드를 작성할 필요가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.