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

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



답변

[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타일 배경은 상태 표시 줄에 바둑판 식으로 배치되어 흥미로운 디자인 효과를 얻거나 상태 표시 줄에 색상을 지정할 수 있습니다. 이것도 어떤 식 으로든 상태 표시 줄 높이에 영향을 미치지 않습니다.

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


답변

질문에 대한 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);


답변

이 시도:

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


답변

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

UIApplication.shared.statusBarFrame.height


답변

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

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

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

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

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


답변

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

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


답변

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

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

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

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