programing

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

mailnote 2023. 5. 1. 21:43
반응형

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외부에서 UI의 현재 방향을 확인하려면 다음과 같이 하십시오.UIViewController그리고.self.interfaceOrientation사용할 수 없음, 사용[UIApplication sharedApplication].statusBarOrientation.

iOS7용 업데이트.상태 표시줄의 시각적 스타일이 변경되더라도 상태 표시줄의 프레임은 그대로 유지됩니다.상태 표시줄에 대한 유일한 흥미로운 발견 - 공유: 당신의UINavigationBar타일 배경도 상태 표시줄에 표시되므로 흥미로운 디자인 효과를 얻거나 상태 표시줄에 색을 칠할 수 있습니다.이 역시 상태 표시줄 높이에 영향을 미치지 않습니다.

탐색 막대 모양의 배경도 상태 표시줄에 정렬됩니다.

다음 질문에 대한 마틴의 제안을 따릅니다. iPhone 상태 표시줄 높이를 가져옵니다.

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;

Swift 3 또는 Swift 4:

UIApplication.shared.statusBarFrame.height

상태 표시줄의 높이는 일반적으로 20pt이지만 다음과 같은 경우에는 두 배가 될 수 있습니다.

  • 전화 통화 중일 때(매우 일반적인 시나리오);
  • 음성 녹음기, Skype 또는 유사한 앱이 배경에서 마이크를 사용하고 있을 때;
  • 개인 핫스팟이 활성화된 경우;

그냥 해보세요, 그러면 당신이 직접 볼 수 있을 겁니다.높이를 20pt로 하드코딩하면 보통 작동하지 않을 때까지 작동합니다.

그래서 저는 H2CO3의 대답을 두 번째로 들었습니다.

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

편집 iOS 11에서 보기 콘텐츠를 맨 위에 배치하는 방법은 UIView입니다.safeAreaLayoutGuideUIView 설명서를 참조하십시오.

권장되지 않는 답변 iOS 7+를 대상으로 하는 경우, UIViewController에 대한 설명서는 ViewController의topLayoutGuide속성은 상태 표시줄의 맨 아래 또는 탐색 모음의 맨 아래(표시되는 경우)를 제공합니다.그것은 유용할 수 있으며, 이전의 많은 솔루션보다 확실히 덜 해킹됩니다.

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

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

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

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

그러면 상태BarFrame의 높이 속성을 직접 읽을 수 있습니다.이 경우 'View(보기)'는 측정값을 사용하고자 하는 보기여야 하며, 대부분 응용 프로그램 창의 루트 보기 컨트롤러입니다.

참고로 전화 통화 중에 상태 표시줄이 더 커질 수 있을 뿐만 아니라 상태 표시줄이 의도적으로 숨겨져 있는 경우에는 0이 될 수도 있습니다.

    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
    }

UIApplication.shared.statusBarFrame.heightiOS 13에서 더 이상 사용되지 않습니다.

'statusBarFrame'은 iOS 13.0에서 더 이상 사용되지 않습니다. 대신 창 장면의 statusBarManager 속성을 사용하십시오.

다음과 같이 iOS 13에서 상태 표시줄 높이를 검색할 수 있습니다.

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

NB! 옵션이므로 폴백이 올바른지 확인하십시오.

화면 상태 표시줄 높이를 가져오는 빠른 방법은 다음과 같습니다.

var screenStatusBarHeight: CGFloat {
    return UIApplication.sharedApplication().statusBarFrame.height
}

이것들은 제 프로젝트의 표준 기능으로 포함되어 있습니다: https://github.com/goktugyil/EZSwiftExtensions

의 상태 으로 "iOS의 상태 표시줄 높이"입니다.20 pt.

더 많은 정보: http://www.idev101.com/code/User_Interface/sizes.html

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

탐색 막대 높이 - 상단 레이아웃 가이드 길이 = 상태 막대 높이

스위프트:

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

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

스위프트 5

UIA 응용 프로그램.shared.statusBarFrame.높이

다음의 단일 라인 코드를 사용하여 모든 방향에서 상태 표시줄 높이를 확인할 수 있으며, 표시 여부도 확인할 수 있습니다.

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

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

언급URL : https://stackoverflow.com/questions/12991935/how-to-programmatically-get-ios-status-bar-height

반응형