iPhone 앱에서 iOS 7 상태 표시 줄을 iOS 6 기본 스타일로 되돌 립니까?


292

iOS 7에서는 다음 UIStatusBar과 같이보기와 병합되는 방식으로 설계되었습니다.

Tina Tavčar가 디자인 한 GUI ( Tina Tavčar가 디자인 한 GUI )

  • 멋지지만 뷰 상단에 무언가가 있으면 뷰가 다소 엉망이되고 상태 표시 줄과 겹칩니다.

  • 작동 방식을 겹치지 않고 iOS6의 상태로 되돌릴 수있는 간단한 솔루션 (info.plist에서 속성 설정 등)이 있습니까?

  • 더 간단한 해결책은 self.view.center.x모든 단일 뷰 컨트롤러에 + 20 점을 갖는 것이지만 다른 크기로 변경하면 (다른 self.view.center.x사용자 정의 segues 등에 문제가 발생할 수 있음) 갑자기 지루한 작업으로 바뀝니다. 피하는 것이 가장 좋습니다.

  • 누군가 나를 위해 하나의 라이너 솔루션을 제공 할 수 있다면 정말 기쁠 것입니다.

추신 : 나는 같은 일을함으로써 상태 표시 줄을 숨길 수 있다는 것을 알고있다.

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

에서 didFinishLaunchingWithOptions내가 진짜 해결책 것을 고려하지 않도록 방법,하지만 해결 방법이 문제를 피할 수있는 바로 가기가 있습니다.


6
슬프게 검은 상태 표시 줄은
iOS

@GangstaGraham에 동의합니다. 그 색깔은 아름답습니다 ! 귀하의 질문에 대답하기 위해, 나는 당신이 할 수없는 것을 두려워합니다. 상태 표시 줄이 현재와 같이 설계된 이유는 반 투명성이 새로운 iOS이며 응용 프로그램에 무언가 위에 있다고 말하여 "심도"를 부여하도록 설계 되었기 때문입니다.
Cole Johnson

preferredStatusBarStyle을 UIStatusBarDefault로 설정하려고 했습니까? Checkout iOS 7 UIViewController 문서
theaob

1
갖는 UIStatusBarDefault상태 표시 줄에 대한 만 컬러의 내용 검은한다. iOS6의 작동 방식으로 돌아 가지 않을 것입니다.
吖 奇 说-何魏奇 Archy Will He

2
이것으로 운이 있습니까? 나는 iOS7을 좋아하지만이 일이 나를 미치게합니다!
Mihai Fratu

답변:


449

이것은 내가 작성한 블로그 게시물 에서 교차 게시 되었지만 iOS 7의 상태 표시 줄, 탐색 표시 줄 및 컨테이너보기 컨트롤러에 대한 전체 요약입니다.

  1. iOS 6 스타일 상태 표시 줄 레이아웃을 유지하는 방법은 없습니다. iOS 7의 상태 표시 줄은 항상 응용 프로그램과 겹칩니다

  2. 상태 표시 줄 모양을 상태 표시 줄 레이아웃과 혼동하지 마십시오. 모양 (밝음 또는 기본값)은 상태 표시 줄 배치 방법 (프레임 / 높이 / 중첩)에 영향을 미치지 않습니다. 시스템 상태 표시 줄에 더 이상 배경색이 없다는 점에 유의해야합니다. API가 UIStatusBarStyleLightContent를 참조 할 때 맑은 배경에 흰색 텍스트를 의미합니다. UIStatusBarStyleDefault는 맑은 배경에 검은 색 텍스트입니다.

  3. 상태 막대 모양은 상호 배타적 인 두 가지 기본 경로 중 하나를 따라 제어됩니다. 전통적인 방식으로 프로그래밍 방식으로 설정하거나 UIKit이 UIViewController의 일부 새로운 속성을 기반으로 모양을 업데이트합니다. 후자의 옵션은 기본적으로 켜져 있습니다. “ViewController 기반 상태 표시 줄 모양”에 대한 앱의 plist 값을 확인하여 사용중인 값을 확인하십시오. 이 값을 YES로 설정하면 표준 UIKit 컨테이너 뷰 컨트롤러 이외의 앱의 모든 최상위 뷰 컨트롤러가 preferredStatusBarStyle을 재정 의하여 기본 또는 라이트 스타일을 반환해야합니다. plist 값을 NO로 편집하면 익숙한 UIApplication 메소드를 사용하여 상태 표시 줄 모양을 관리 할 수 ​​있습니다.

  4. UINavigationController는 다소 이상하고 문서화되지 않은 제약 조건에 따라 UINavigationBar의 높이를 44 포인트 또는 64 포인트로 변경합니다. UINavigationController가 뷰의 프레임 상단이 UIWindow의 상단과 시각적으로 연속적임을 감지하면 높이가 64 포인트 인 내비게이션 바를 그립니다. 뷰의 상단이 UIWindow의 상단과 인접하지 않은 경우 (한 지점 만 꺼져도) 내비게이션 바는 높이가 44 포인트 인 "전통적인"방식으로 그립니다. 이 논리는 응용 프로그램의 뷰 컨트롤러 계층 내부에 여러 자식이 있더라도 UINavigationController에 의해 수행됩니다. 이 동작을 막을 방법이 없습니다.

  5. 높이가 44 포인트 (88 픽셀) 인 사용자 정의 탐색 막대 배경 이미지를 제공하고 UINavigationController의보기 범위가 UIWindow의 범위와 일치하면 (# 4에서 설명한대로) UINavigationController는 이미지를 프레임에 그려줍니다 (0,20,320) , 44), 사용자 지정 이미지 위에 20 포인트의 불투명 한 검은 색 공간을 남겨 둡니다. 이것은 규칙 # 1을 우회 한 영리한 개발자라고 생각하는 데 혼란을 줄 수 있지만 실수입니다. 탐색 막대의 키는 여전히 64 포인트입니다. 슬라이드-공개 스타일 뷰 계층 구조에 UINavigationController를 포함하면이를 명확하게 알 수 있습니다.

  6. UIViewController의 헷갈 리게 명명 된 edgeForExtendedLayout 속성에주의하십시오. 대부분의 경우 edgeForExtendedLayout 조정은 아무 것도 수행하지 않습니다. UIKit이이 속성을 사용하는 유일한 방법은 UINavigationController에 뷰 컨트롤러를 추가 한 경우 UINavigationController는 edgesForExtendedLayout을 사용하여 자식 뷰 컨트롤러가 탐색 표시 줄 / 상태 표시 줄 영역 아래에 표시되어야하는지 여부를 결정하는 것입니다. UINavigationController 자체에서 edgeForExtendedLayout을 설정하면 UINavigationController의 높이가 44 또는 64 포인트 인 탐색 막대 영역이 있는지 여부를 변경하지 않습니다. 해당 논리에 대해서는 # 4를 참조하십시오. 툴바 또는 UITabBarController를 사용할 때 유사한 레이아웃 로직이보기의 맨 아래에 적용됩니다.

  7. UINavigationController 내부에서 사용자 정의 하위 뷰 컨트롤러가 탐색 막대 아래에 겹치는 것을 방지하기 위해 edgeForExtendedLayout을 UIRectEdgeNone (또는 UIRectEdgeTop를 제외하는 마스크)으로 설정하십시오. 뷰 컨트롤러의 수명주기에서이 값을 가능한 빨리 설정하십시오.

  8. UINavigationController 및 UITabBarController는 하위 뷰 계층 구조에서 테이블 뷰 및 컬렉션 뷰의 contentInsets를 채우려 고 시도합니다. # 4의 상태 표시 줄 논리와 유사한 방식으로이 작업을 수행합니다. 테이블보기 및 콜렉션보기에 대해 automaticAdjustsScrollViewInsets를 NO로 설정하여이를 방지하는 프로그래밍 방식이 있습니다 (기본값은 YES). Whisper 및 Riposte에는 심각한 문제가 발생했습니다. 도구 모음 및 키보드 이동에 따라 contentInset 조정을 사용하여 테이블보기의 레이아웃을 제어하기 때문입니다.

  9. 반복 : iOS 6 스타일 상태 표시 줄 레이아웃 논리로 돌아갈 수있는 방법이 없습니다. 이를 근사하려면 앱의 모든보기 컨트롤러를 화면 상단에서 20 포인트 오프셋 된 컨테이너보기로 이동해야합니다. 이전보기를 시뮬레이션하기 위해 상태 표시 줄 뒤에 의도적으로 검은 색보기를 남겨 둡니다. 이것이 우리가 Riposte와 Whisper에서 사용했던 방법입니다.

  10. Apple은 # 9를 시도하지 않도록 매우 열심히 노력하고 있습니다. 그들은 우리가 상태 표시 줄을 밑받침하기 위해 모든 앱을 다시 디자인하기를 원합니다. 그러나 사용자 경험과 기술적 이유로 인해 이것이 항상 좋은 생각이 아닌 이유에 대해 많은 논쟁이 있습니다. 사용자에게 가장 적합한 것을 수행해야하며 단순히 플랫폼의 기발한 행동을 따르지 않아야합니다.


35
상단 레이아웃 가이드에 첨부 할 뷰 상단에있는 모든 것에 구속 조건을 추가 할 수 있다는 것을 추가하고 싶었습니다. 그러면 상태 표시 줄 뒤에 빈 공간이 생깁니다 (원하는 색상으로 채울 수 있음). iOS 6에서도보기가 자동으로 올바른 위치로 조정될 수 있습니다. 그렇게하면 코드에서 뷰의 위치를 ​​수동으로 조정할 필요가 없습니다.
BreadicalMD

4
훌륭한 솔루션입니다. AutoLayout에 대한 나의 무지를 드러 냈습니다. 더 잘해
jaredsinclair

1
객체의 상단 공간을 상단 레이아웃 안내 선의 가장자리 아래에 배치하면 구속 조건 컨트롤을 사용하여 가장 가까운 이웃에 수직 간격 구속 조건을 추가 할 수 있습니다. 이제 상단 레이아웃 안내선이됩니다. 또는 객체에서 상단 레이아웃 안내서로 ctrl + 클릭을 사용하여 수직 간격 제약 조건을 명시 적으로 추가 할 수 있습니다.
BreadicalMD

2
@BreadicalMD 내가 이해할 수없는 한 부분은 -topLayoutGuide를 iOS 6에서 사용할 수 없다는 것입니다. 따라서 iOS 7 및 6에서 다른 자동 레이아웃 제약 조건을 사용해야합니까?
Jeremy Jeremy

1
좋은 대답 ...하지만 의심의 여지가 있습니다 1) UINavigationController 높이 부분을 변경합니다. 더 자세히 설명하십시오. 감사합니다
user1010819

122

2013 년 9 월 19 일 업데이트 :

추가하여 스케일링 버그 수정 self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);

NSNotificationCenter진술서에 오타 수정


2013 년 9 월 12 일 업데이트 :

수정 UIViewControllerBasedStatusBarAppearanceNO

화면 회전 기능이있는 앱을위한 솔루션 추가

상태 표시 줄의 배경색을 변경하는 방법을 추가했습니다.


분명히 iOS7 상태 표시 줄을 iOS6에서 작동하는 방식으로 되돌릴 수있는 방법이 없습니다.

그러나 항상 일부 코드를 작성하고 상태 표시 줄을 iOS6와 같은 것으로 바꿀 수 있으며 이것이 내가 가장 짧은 방법입니다.

  1. 설정 UIViewControllerBasedStatusBarAppearanceNO있는 info.plist(뷰 컨트롤러 우리가 UIApplicationstatusBarStyle 방법을 사용하여 상태 표시 줄 스타일을 설정 할 수 있도록 상태 표시 줄 스타일을 조정할 필요없이 탈퇴합니다.)

  2. AppDelegate 's application:didFinishLaunchingWithOptions에서

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
        [application setStatusBarStyle:UIStatusBarStyleLightContent];
        self.window.clipsToBounds =YES;
        self.window.frame =  CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
    
        //Added on 19th Sep 2013
        self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
    }
    return YES;
    


하기 위해 :

  1. iOS 7인지 확인하십시오.

  2. UIStatusBarStyleDefault와 반대로 상태 표시 줄의 내용을 흰색으로 설정하십시오.

  3. 가시 범위를 넘어 확장 된 서브 뷰가 표시되지 않도록합니다 (위에서 메인 뷰로 애니메이션되는 뷰의 경우).

  4. 앱의 창 프레임을 이동하고 크기를 조정하여 iOS 6의 상태와 같이 상태 표시 줄이 공간을 차지한다는 환상을 만듭니다.


화면 회전이있는 앱의 경우

NSNotificationCenter를 사용하여 방향 변경을 감지하여 추가

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidChangeStatusBarOrientation:)
name:UIApplicationDidChangeStatusBarOrientationNotification
object:nil];

에서 if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)와 것은 AppDelegate에 새로운 방법을 만들 :

- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification
{
    int a = [[notification.userInfo objectForKey: UIApplicationStatusBarOrientationUserInfoKey] intValue];
    int w = [[UIScreen mainScreen] bounds].size.width;
    int h = [[UIScreen mainScreen] bounds].size.height;
    switch(a){
        case 4:
            self.window.frame =  CGRectMake(0,20,w,h);
            break;
        case 3:
            self.window.frame =  CGRectMake(-20,0,w-20,h+20);
            break;
        case 2:
            self.window.frame =  CGRectMake(0,-20,w,h);
            break;
        case 1:
           self.window.frame =  CGRectMake(20,0,w-20,h+20);
    }
}

따라서 방향이 변경되면 앱의 화면 방향 (세로, 거꾸로, 가로 왼쪽 또는 가로 오른쪽)을 감지하고 앱의 창 프레임을 각각 변경하여 iOS 6 상태 표시 줄 환상을 만들기 위해 switch 문을 트리거합니다.


상태 표시 줄의 배경색을 변경하려면

더하다

 @property (retain, nonatomic) UIWindow *background;

에서가 AppDelegate.h만드는 background클래스의 속성을하고 할당 해제에서 ARC를 방지 할 수 있습니다. ARC를 사용하지 않는 경우에는 할 필요가 없습니다.

그런 다음 UIWindow를 if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)다음 과 같이 만들어야합니다 .

background = [[UIWindow alloc] initWithFrame: CGRectMake(0, 0, self.window.frame.size.width, 20)];
background.backgroundColor =[UIColor redColor];
[background setHidden:NO];

잊지 마세요 @synthesize background;@implementation AppDelegate!


3
회전이 끊어집니다. 그냥 머리 위로
제시 Naugher

2
@JesseNaugher 프로그래밍 방식으로 세로 간격 제약 조건을 0에서 20으로 수정하는 것이 좋습니다. 회전시 작동합니다.
전문가

2
탐색 막대가 20 픽셀 씩 확장되는 것을 피할 수있는 방법에 대한 아이디어가 있습니까? 이 솔루션은 나에게 적합하지만 내 탐색 표시 줄이 20 픽셀 너무 높습니다.
simonbs

4
@ArchyHolt : 모달 뷰 컨트롤러를 제시 할 때를 제외하고 간단한 솔루션이 효과적입니다. 모달 뷰 컨트롤러가 닫히면 나머지 뷰는 이제 상태 표시 줄 아래에 있습니다. 나는 펑키 한 다른 일이 없도록 신선한 샘플 프로젝트에서 이것을 재현했습니다. 귀하의 고급 솔루션이 여기에서 유용 할 수 있다고 생각하지만 어떤 알림이 작동하는지 확실하지 않습니다. 어떤 아이디어?
markdorison

4
모달 뷰 컨트롤러를 닫은 후 뷰가 재설정됩니다. :(
KarenAnne

41

업데이트 (새로운 솔루션)

이 업데이트는 iOS 7 탐색 표시 줄 문제의 최상의 솔루션입니다. 탐색 표시 줄 색 예를 설정할 수 있습니다. FakeNavBar.backgroundColor = [UIColor redColor];

참고 : 기본 내비게이션 컨트롤러를 사용하는 경우 이전 솔루션을 사용하십시오.

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    if(NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0)
    {
        UIView *FakeNavBar = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];
        FakeNavBar.backgroundColor = [UIColor whiteColor];

        float navBarHeight = 20.0;
        for (UIView *subView in self.window.subviews) {

            if ([subView isKindOfClass:[UIScrollView class]]) {
                subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height - navBarHeight);
            } else {
                subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height);
            }
        }
        [self.window addSubview:FakeNavBar];
    }

    return YES;

}

이전 솔루션-이전 코드를 사용하는 경우 다음 코드 및 이미지를 무시하십시오.

이것은 iOS 7 네비게이션 바 솔루션의 구 버전입니다.

다음 코드로 문제를 해결했습니다. 상태 표시 줄을 추가하기위한 것입니다. didFinishLaunchingWithOptions

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
    UIView *addStatusBar = [[UIView alloc] init];
    addStatusBar.frame = CGRectMake(0, 0, 320, 20);
    addStatusBar.backgroundColor = [UIColor colorWithRed:0.973 green:0.973 blue:0.973 alpha:1]; //change this to match your navigation bar
    [self.window.rootViewController.view addSubview:addStatusBar];
}

그리고 Interface Builder의 경우 iOS 6으로 열 때 사용됩니다. 0 픽셀에서 시작합니다.

참고 : iOS 6/7 델타는 세부 정보 창의 "파일 관리자"(가장 왼쪽 아이콘)에서 View Controller에 대해 "자동 레이아웃 사용"을 선택 취소 한 경우에만 나타납니다.

여기에 이미지 설명을 입력하십시오


6
당신은 내 하루를 만들었다. 도움을 위해 +1을 가져 가라!
Niru Mukund Shah

5
참고 : iOS 6/7 델타는 세부 정보 창의 "파일 관리자"(가장 왼쪽 아이콘)에서 View Controller에 대해 "자동 레이아웃 사용"을 선택 취소 한 경우에만 나타납니다.
Matt

1
고마워요! 당신은 나에게 많은 문제를 저장했습니다!
neowinston 2009

2
누가 iOS 6 스타일 상태 표시 줄 레이아웃을 유지할 수 없다고 말했습니까? @ TacettinÖzbölük 방법 으로이 작업을 수행 할 수 있습니다 ...이 awsum 솔루션에 대한 감사합니다.
Vizllx

1
좋은 것! 또한, 단지 참고 사과에 지금이 선호 : 경우 (NSFoundationVersionNumber> = NSFoundationVersionNumber_iOS_6_1) {}
조엘 발머

26

해결책 :

메소드를 재정 의하여 viewcontroller 또는 rootviewcontroller에서 설정하십시오.

-(BOOL) prefersStatusBarHidden
    {
        return YES;
    }

나쁜 해결책은 아닙니다. 바를 완전히 제거하십시오. 항상 UX에 이상적이지 않지만 실행 가능할 수 있습니다.
Farhan Hafeez

간단하게 완벽하게 나를 위해 일했습니다.
madLokesh

시나리오 : 비디오를 전체 화면으로 재생 한 후 UIVIew로 다시 전환하면 하단에 상태 표시 줄의 크기 인 검은 색 막대가 표시되지만 이미 상태 표시 줄을 사용하고있었습니다. 상태 표시 줄을 모두 제거했으며 이제 문제가 해결되었습니다.
madLokesh

난 단지이 방법을 사용하여 성공적이었다
user2277872을

17

스토리 보드를 광범위하게 사용하는 프로젝트에 대한 또 다른 접근법은 다음과 같습니다.

골:

이 접근법의 목표는 iOS6에서와 동일한 iOS7에서 동일한 상태 표시 줄 스타일을 재생성하는 것입니다 (질문 제목 "iOS 7 상태 표시 줄이 iOS 6 스타일로 돌아가시겠습니까?"참조).

요약:

이를 달성하기 위해 델타를 사용하여 iOS 6.1 이하 버전의 레이아웃 변경 사항을 되 돌리는 동안 델타를 사용하여 상태 표시 줄 (iOS 7 아래)과 겹치는 UI 요소를 아래로 이동하여 스토리 보드를 최대한 많이 사용합니다. 그런 다음 iOS 7의 추가 공간은 backgroundColor가 선택한 색상으로 설정된 UIView가 차지합니다. 후자는 코드 또는 스토리 보드를 사용하여 만들 수 있습니다 (아래의 대안 참조).

가정 :

아래 단계를 수행 할 때 원하는 결과를 얻으려면 View controller-based status bar appearanceNO로 설정되어 있고Status bar style 설정하고 "투명 블랙 스타일 (알파 0.5)"또는 "불투명 블랙 스타일" . 두 설정 모두 프로젝트 설정의 "정보"에서 찾거나 추가 할 수 있습니다.

단계 :

  • UIWindow에 하위 뷰를 추가하여 상태 표시 줄 배경으로 사용하십시오. 이를 달성하려면 AppDelegate에 다음을 추가하십시오.application: didFinishLaunchingWithOptions: 한 후makeKeyAndVisible

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
        UIView *statusBarBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, yourAppsUIWindow.frame.size.width, 20)];
        statusBarBackgroundView.backgroundColor = [UIColor blackColor];
        [yourAppsUIWindow addSubview:statusBarBackgroundView];
    }
    
  • 프로그래밍 방식으로 iOS 7의 배경 만 추가 했으므로 iOS6의 레이아웃을 유지하면서 상태 표시 줄과 겹치는 UI 요소의 레이아웃을 조정해야합니다. 이를 위해 다음을 수행하십시오.

    • 확인하십시오 Use Autolayout스토리 보드에 대해 가 (그렇지 않으면 "iOS 6/7 델타"가 크기 관리자에 표시되지 않기 때문 임). 이것을하기 위해:
      • 스토리 보드 파일을 선택하십시오
      • 유틸리티 표시
      • "파일 검사기 표시"를 선택하십시오.
      • "인터페이스 빌더 문서"에서 "자동 레이아웃 사용"을 선택 취소하십시오.
    • 선택적으로 적용 할 때 iOS 7 및 6의 레이아웃 변경 사항을 모니터링하려면 "Assistant Editor"를 선택하고 "Preview"및 "iOS 6.1 또는 이전 버전"을 선택하십시오. 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오
    • 이제 조정하려는 UI 요소를 선택하여 더 이상 상태 표시 줄과 겹치지 않도록하십시오.
    • 유틸리티 열에서 "크기 검사기 표시"를 선택하십시오.
    • 상태 막대 bg 높이와 동일한 양으로 Y 축을 따라 UI 요소의 위치를 ​​변경합니다. 여기에 이미지 설명을 입력하십시오
    • 그리고 상태 표시 줄 bg 높이와 동일한 음수만큼 Y의 iOS6 / 7 델타 값을 변경하십시오 (사용하는 경우 iOS 6 미리보기의 변경 사항에 유의하십시오). 여기에 이미지 설명을 입력하십시오

대안 :

스토리 보드가 많은 프로젝트에서 코드를 적게 추가하고 상태 표시 줄 배경을 자동으로 회전 시키려면 상태 표시 줄의 배경을 프로그래밍 방식으로 추가하는 대신 해당 뷰 컨트롤러의 기본 뷰 맨 위에있는 각 뷰 컨트롤러에 색상보기를 추가 할 수 있습니다. 그런 다음이 새로운 뷰의 높이 델타를 뷰의 높이와 동일한 음의 양으로 변경합니다 (iOS 6에서 사라지게하기 위해).

이 대안의 단점은 (자동 회전 호환성을 고려할 때 무시해도되지만) iOS 6 용 Storyboard를 볼 때이 추가보기가 즉시 표시되지 않는다는 사실입니다. " 스토리 보드의 문서 개요 "


12

뷰 컨트롤러가 상태 표시 줄 (및 탐색 표시 줄)과 겹치지 않게하려면 Xcode 5의 인터페이스 빌더 에서 "상단 바 아래 가장자리 확장"상자를 선택 취소하십시오 .

상단 막대 아래 모서리 확장을 선택 취소합니다


7
스토리 보드를 사용하는 경우에만 가능합니다
Cœur

3
내비게이션 컨트롤러 또는 탭바 컨트롤러와 같은 컨테이너 vc에서만 작동합니다.
Andrea

2
edgeForExtendedLayout은 컨테이너 뷰 컨트롤러 (예 : UINavigationController)에서만 자식 뷰를 부모 크롬과 겹쳐 야하는지 여부를 결정하는 데 사용됩니다. UIWindow의 루트 뷰 컨트롤러에서이 속성을 설정하면 아무 작업도 수행되지 않습니다. 위의 내 답변보기 : stackoverflow.com/questions/18294872/…
jaredsinclair

UITabBarController @Andrea에 대해 어떻게합니까? 감사.
KarenAnne

@KarenAnne 프로그래밍 방식으로 또는 스토리 보드로 작업하는지에 따라 다릅니다. 프로그래밍 방식으로 edgeForExtent 속성을 UITabBarViewController 내부에 표시하는보기 컨트롤러에서 원하는대로 설정해야하지만 상태 표시 줄에 문제가 없으면 UITabbarController 내부에 uinavigationcontroller를로드해야합니다. 여기를 확인하십시오. developer.apple.com/library/ios/documentation/UserExperience/…
Andrea

11

5
Apple은 모든 사람들이 자동 레이아웃을 사용한다고 가정합니다. 자동 레이아웃은 Xcode 4에서 끔찍했으며 Xcode 5는 방금 출시되었으므로 이것은 의심스러운 가정입니다.
Glenn Maynard 님

1
그러나 전망에 따르면 이것은 더 나은 해결책이며 루트 창 또는 상태 표시 줄의 프레임 크기를 조정합니다.
Igor

내가 알 수있는 한, rootViewController가 splitViewController이면 Apple의 솔루션이 작동하지 않습니다.
Vern Jensen

8

이 대단한 문제를 해결하기 위해 많은 많은 자습서를 보았습니다. 그러나 그들 중 누구도 작동하지 않습니다! 내 해결책은 다음과 같습니다.

if( [[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f ) {
    float statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
    for( UIView *v in [self.view subviews] ) {
        CGRect rect = v.frame;
        rect.origin.y += statusBarHeight;
        v.frame = rect;
    }
}

논리는 간단합니다. self.view의 모든 자식 뷰를 20 픽셀로 이동합니다. 그게 다야. 그러면 iOS 6과 마찬가지로 스크린 샷이 표시됩니다. 나는 iOS7 상태 표시 줄이 싫어! ~ "~


2
이것을 어디에 추가해야합니까? 앱 델리게이트에서 옵션으로 시작 했습니까?
mhmdshawqi '12

이렇게하면 상태 표시 줄이 흰색으로 바뀝니다
ropo

6

Archy Holt의 대답에 대한 작은 대안, 조금 더 간단합니다.

ㅏ. 설정 UIViewControllerBasedStatusBarAppearanceNO의 Info.plist에

비. 에서 AppDelegate의 ' application:didFinishLaunchingWithOptions:, 전화 :

if ([[UIDevice currentDevice].systemVersion floatValue] < 7)
{
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
}
else
{
    // handling statusBar (iOS7)
    application.statusBarStyle = UIStatusBarStyleLightContent;
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    self.window.clipsToBounds = YES;

    // handling screen rotations for statusBar (iOS7)
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidChangeStatusBarOrientationNotification:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
}

그리고 방법을 추가하십시오 :

- (void)applicationDidChangeStatusBarOrientationNotification:(NSNotification *)notification
{
    // handling statusBar (iOS7)
    self.window.frame = [UIScreen mainScreen].applicationFrame;
}

자체 UIWindow처리를 위해 서브 클래 싱 을 고려할 수도 UIApplicationDidChangeStatusBarOrientationNotification있습니다.


presentViewController : animated : completion에 문제가 있습니까?
Tùng Đỗ

@ TùngĐỗ true, 그래서 더 나은 대안을 만들었습니다 : stackoverflow.com/questions/18294872/…
Cœur

5

모든 뷰 컨트롤러에서 이것을 사용했습니다. 간단합니다. 모든 viewDidLoad 메소드에 다음 행을 추가하십시오.

- (void)viewDidLoad{
    //add this 2 lines:
    if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

    [super viewDidLoad];
}

1
매력처럼 일했고 쉽게 죽었습니다. 루비 모션에서 super use를 호출하기 전에 self.edgesForExtendedLayout = UIRectEdgeNone if respondsToSelector ( "edgesForExtendedLayout")
tehprofessor

4

이 간단한 방법을 사용해보십시오 ....

1 단계 : 단일로 변경viewController

[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];

2 단계 : 전체 응용 프로그램에서 변경

info.plist
      ----> Status Bar Style
                  --->UIStatusBarStyle to UIStatusBarStyleBlackOpaque

3 단계 : 또한 높이 viewWillAppear를 조정하기 위해 이것을 추가하십시오statusbariOS7

    [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 7) {
        CGRect frame = [UIScreen mainScreen].bounds;
        frame.origin.y+=20.0;
        frame.size.height-= 20.0;
        self.view.frame = frame;
        [self.view layoutIfNeeded];
    }


3

iOS 7에서 iOS 6과 같은 상태 표시 줄을 달성했습니다.

info.plist에서 UIViewControllerBasedStatusBarAppearance를 NO로 설정하십시오.

이 코드 PASE - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions방법을

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    [application setStatusBarStyle:UIStatusBarStyleLightContent];
    self.window.clipsToBounds =YES;
    self.window.frame =  CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height);

    //Added on 19th Sep 2013
    NSLog(@"%f",self.window.frame.size.height);
    self.window.bounds = CGRectMake(0,0, self.window.frame.size.width, self.window.frame.size.height);
}

이 코드 다음 그 사용에 온 이상 20 pixels.To 모든 귀하의 의견을 아래로 밀어 수 있습니다 -(void)viewDidAppear:(BOOL)animated방법을

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    CGRect frame=self.view.frame;
    if (frame.size.height==[[NSUserDefaults standardUserDefaults] floatForKey:@"windowHeight"])
    {
        frame.size.height-=20;
    }
    self.view.frame=frame;
}

didFinishLauncing 메소드에서 창 할당 후 windowHeight Userdefaults 값을 설정해야합니다.

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[[NSUserDefaults standardUserDefaults] setFloat:self.window.frame.size.height forKey:@"windowHeight"];

더 좋은 방법은 UINavigationBar height를 44 대신 64 로 만드는 것입니다. 그러면 막대는 Apple의 앱 에서처럼 맨 위로 확장됩니다.
Aaron Brager

@AaronBrager 그러나 내 요구 사항은 iOS 6 스타일 상태 표시 줄을 표시하는 것이 었습니다.
Desert Rose

가로 방향 iOS 7 용 솔루션을 추가 할 수 있습니까?. 나는 똑같은 일을하고 있습니다. 하지만 iOS 7 Landscape에서는 작동하지 않습니다.
sathiamoorthy

@DesertRose THX! 이것은 나를 위해 작동하지만 하단의 uitabbar를 차단합니다. 3 개의 뷰가있는 탭 바 컨트롤러 기반 앱이 있는데 그 중 2 개는 테이블 뷰 컨트롤러입니다.
marciokoko

1
장치를 회전시킬 때까지 (내 iOS 7 장치는 iPad 임)이 기능이 완벽하게 수정됩니다. 그러나 일단 회전하면 검은 막대가 그대로 유지되고 "보기"(잘못된 기술 용어 인 경우 PhoneGap / 웹 사용자 인 경우)가 줄어든 높이를 유지합니다. 넓이. 이 솔루션은 회전을 지원하지 않지만 내가 본 가장 좋은 해결책입니다. 장치 회전을 감시하기 위해 어떻게 개선 할 수 있습니까? 감사!
tylerl

2

인터페이스 빌더를 사용하는 경우 다음을 시도하십시오.

xib 파일에서 :

1) 기본보기를 선택하고 배경색을 검은 색으로 설정하십시오 (또는 상태 표시 줄을 원하는 색상으로 설정하십시오)

2) 배경이 컨트롤러보기의 최상위 하위로 배치 된 자체 포함 된 하위보기인지 확인하십시오.
컨트롤러보기의 직접적인 자식이되도록 배경을 이동하십시오. 자동 크기 조정 패널을 확인하여 모든 프레임 가장자리를 잠그고 두 개의 유연성 축을 활성화했는지 확인하십시오. UIImageView 인 경우 내용 모드를 채우기 위해 크기 조정으로 설정하십시오. 프로그래밍 방식으로 이것은 contentMode를 UIViewContentModeScaleToFill로 설정하고 자동 크기 조정 마스크를 (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)로 설정합니다.

3) 이제 고정 된 모든 것을 20pt 씩 아래로 옮기고 iOS 6/7 델타 Y를 -20으로 설정하십시오.
자동 크기 조정 패널의 상단 프레임에 고정 된 모든 최상위 레벨 하위 항목은 20pt 씩 아래로 이동하고 iOS 6/7 델타 Y를 -20으로 설정해야합니다. (Cmd는 모든 것을 선택하고 아래쪽 화살표를 20 번 클릭하십시오-더 좋은 방법이 있습니까?)

4) 유연한 높이를 가진 위의 모든 항목의 iOS 6/7 델타 높이를 조정하십시오. 프레임 상단과 하단에 고정되어 있고 자동 크기 조정 패널에서 유연한 높이를 활성화 한 모든 항목의 iOS 6/7 델타 높이도 20으로 설정해야합니다. 여기에는 위에서 언급 한 배경보기가 포함됩니다. 이것은 직관적이지 않은 것처럼 보이지만 적용 순서에 따라 필요합니다. 먼저 프레임 높이를 설정 한 다음 (디바이스 기반) 델타가 적용되고 마지막으로 자동 크기 조정 마스크가 모든 자식 프레임의 오프셋 위치를 기준으로 적용됩니다.

5) 마지막으로 하단 프레임에 고정되었지만 상단 프레임이 아닌 항목은 델타가 전혀 필요하지 않습니다.

iOS7과 iOS6에서 동일한 상태 표시 줄을 제공합니다.

반면, iOS6 호환성을 유지하면서 iOS7 스타일을 원한다면 백그라운드보기에 대해 델타 Y / 델타 높이 값을 0으로 설정하십시오.

더 많은 iOS7 마이그레이션 정보를 보려면 전체 게시물을 읽으십시오 : http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html


자동 레이아웃을 사용할 때 델타가 없음
lostintranslation

2

내 솔루션은 UIViewiOS 7에서 창 위에 20 포인트의 높이 를 추가하는 것이 었습니다 . 그런 다음 AppDelegate 클래스에서 "솔리드"상태 표시 줄 배경을 표시하거나 숨기는 메서드를 만들었습니다. 에서 application:didFinishLaunchingWithOptions::

// ...

// Add a status bar background
self.statusBarBackground = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 20.0f)];
self.statusBarBackground.backgroundColor = [UIColor blackColor];
self.statusBarBackground.alpha = 0.0;
self.statusBarBackground.userInteractionEnabled = NO;
self.statusBarBackground.layer.zPosition = 999; // Position its layer over all other views
[self.window addSubview:self.statusBarBackground];

// ...
return YES;

그런 다음 검은 상태 표시 줄 배경을 페이드 인 / 아웃하는 방법을 만들었습니다.

- (void) showSolidStatusBar:(BOOL) solidStatusBar
{
    [UIView animateWithDuration:0.3f animations:^{
        if(solidStatusBar)
        {
            [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
            self.statusBarBackground.alpha = 1.0f;
        }
        else
        {
            [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
            self.statusBarBackground.alpha = 0.0f;
        }
    }];
}

지금해야 할 일은 전화가 [appDelegate showSolidStatusBar:YES]필요할 때입니다.


2

더 이상 프레임을 직접 조작 할 수 없기 때문에 자동 레이아웃을 사용하면이 문제가 압도적 일 수 있습니다. 너무 많은 작업이없는 간단한 해결책이 있습니다.

유틸리티 클래스에서 유틸리티 메소드를 작성하고 모든 뷰 컨트롤러의 viewDidLayoutSubviews메소드 에서 호출했습니다 .

+ (void)addStatusBarIfiOS7:(UIViewController *)vc
    {
        if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
            CGRect viewFrame = vc.view.frame;
            if(viewFrame.origin.y == 20) {
                //If the view's y origin is already 20 then don't move it down.
                return;
            }
            viewFrame.origin.y+=20.0;
            viewFrame.size.height-= 20.0;
            vc.view.frame = viewFrame;
            [vc.view layoutIfNeeded];
        }
    }

viewDidLayoutSubviews상태 표시 줄을 원하는 뷰 컨트롤러에서 메소드를 재정의하십시오 . Autolayout의 부담을 덜어 줄 것입니다.

- (void)viewDidLayoutSubviews
{
    [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
    [super viewDidLayoutSubviews];
    [MyUtilityClass addStatusBarIfiOS7:self];
}

1

가장 쉬운 방법은 최신 SDK를 최신 Xcode에 설치하는 것입니다.

최신 Xcode에 이전 SDK를 설치하는 방법은 무엇입니까?

  1. U는 http://www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.html 에서 iOS 6.1 SDK를 얻 거나 이전 Xcode를 다운로드하여 컨텐츠에서 SDK를 가져올 수 있습니다

  2. 이 폴더의 압축을 풀고 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDK에 붙여 넣기

  3. xcode를 다시 시작하십시오.

  4. U는 이제 프로젝트 빌드 설정에서 이전 SDK를 선택할 수 있습니다

그것이 당신을 돕기를 바랍니다. 그것은 나를 위해 일했다 =)


나를 위해 일했다. @marcelosalloum에게 감사하지만 여전히 내 앱의 업데이트를 위해 iOS7의 투명 상태 표시 줄을 지원하기 위해 phonegap (uiwebview) 앱에 대한 해결 방법을 찾고 있습니다. 다시 감사합니다. ;)
hanism

@marcellosaloum, 애플이 앱을 승인 할 것입니까? 그들은 XCode 4로 컴파일 된 앱은 더 이상 허용되지 않을 것이라고 말했습니다. 실제적으로 iOS 6 SDK를 의미합니다.
Valerio

Xcode5가 이전 iOS SDK를 컴파일 할 수 있기 때문에 내 앱이 실제로 승인되었습니다. 당신이 말한 것처럼 AppStore가 Xcode4 내장 앱을 거부할지 (Xcode4! = iOS 6 SDK) 거부할지 확실하지 않습니다.
marcelosalloum

2 월 1 일 이후였습니까? 그날 애플은이를 의무화했다.
Valerio

아니요, 작년에 마지막으로 코드를 건 드렸습니다. 애플이 그 의무를 다했다는 것을 몰랐다. 그 링크를 여기에 게시 하시겠습니까? 건배
marcelosalloum

1

presentViewController:animated:completion:엉망인을 사용함에 따라이 window.rootViewController.view문제에 대한 다른 접근 방식을 찾아야했습니다. 마침내 rootViewController의 UIView를 서브 클래스 화하여 모달 및 회전 작업을 수행했습니다.

.h

@interface RootView : UIView

@end

.미디엄

@implementation RootView

-(void)setFrame:(CGRect)frame
{
    if (self.superview && self.superview != self.window)
    {
        frame = self.superview.bounds;
        frame.origin.y += 20.f;
        frame.size.height -= 20.f;
    }
    else
    {
        frame = [UIScreen mainScreen].applicationFrame;
    }

    [super setFrame:frame];
}

- (void)layoutSubviews
{
    self.frame = self.frame;

    [super layoutSubviews];
}

@end

이제 iOS7 애니메이션에 대한 강력한 해결 방법이 있습니다.


1

나는이 답변에 늦었지만, 내가 한 일을 공유하고 싶습니다. 기본적으로 가장 쉬운 해결책입니다

우선-> info.plist파일로 이동하여 상태 표시 줄 스타일-> 투명 블랙 스타일 (알파 0.5)을 추가하십시오.

자, 여기 간다 :-

이 코드를 AppDelegate.m에 추가하십시오

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
     //Whatever your code goes here
  if(kDeviceiPad){

     //adding status bar for IOS7 ipad
         if (IS_IOS7) {
              UIView *addStatusBar = [[UIView alloc] init];
              addStatusBar.frame = CGRectMake(0, 0, 1024, 20);
              addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //change this to match your navigation bar
              [self.window.rootViewController.view addSubview:addStatusBar];
                    }
                }
    else{

         //adding status bar for IOS7 iphone
        if (IS_IOS7) {
            UIView *addStatusBar = [[UIView alloc] init];
            addStatusBar.frame = CGRectMake(0, 0, 320, 20);
            addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //You can give your own color pattern
            [self.window.rootViewController.view addSubview:addStatusBar];
        }

    return YES;
   }

0

매우 간단한 해결책 (수직 방향 만 지원한다고 가정)은 App delegate didFinishLaunchingWithOptions 메소드에서 iOS 버전 7 이하의 응용 프로그램 창 범위를 재정의하는 것입니다.

CGRect screenBounds = [[UIScreen mainScreen] bounds];
if ([HMService getIOSVersion] < 7) {
    // handling statusBar (iOS6) by leaving top 20px for statusbar.
    screenBounds.origin.y = 20;
    self.window = [[UIWindow alloc] initWithFrame:screenBounds];
}
else {
    self.window = [[UIWindow alloc] initWithFrame:screenBounds];
}

코드는 'y'를 0에서 20으로 이동하지만 그에 따라 높이를 조정하지 않으므로 screenBounds.size.height-= 20; screenBounds.origin.y = 20 직후;
Amit C.

0

상태 표시 줄을 모두 숨길 수 있습니다. 따라서 앱은 전체 화면이됩니다. 나는 그것이 당신이 얻을 수있는 최선이라고 생각합니다.

UIStatusBarStyleNone 또는 대상 설정에서 설정하십시오.


2
UIStatusbarstylenone을 지정하는 위치
user4951

0

iOS 7에서 상태 표시 줄 숨기기 단계 :

1. 응용 프로그램 info.plist 파일로 이동하십시오.

2. 및 설정, 컨트롤러 기반 상태 표시 줄보기 : 부울 NO

상태 표시 줄 문제를 해결하기를 바랍니다 .....


0

setStatusBarHidden에 대한 작업을 계속하려면이 카테고리를 사용합니다.

@interface UIApplication (StatusBar)

-(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden;

@end

@implementation UIApplication (StatusBar)

-(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden{
    if (!IOS7) {
        [self setStatusBarHidden:statusBarHidden];
        return;
     }

    if ([self isStatusBarHidden] == statusBarHidden) {
        return;
    }

    [self setStatusBarHidden:statusBarHidden];
    [self keyWindow].clipsToBounds = YES;
    CGFloat offset = statusBarHidden ? 0 : 20;
    [self keyWindow].frame =  CGRectMake(0,offset,[self keyWindow].frame.size.width,[self keyWindow].frame.size.height-offset);
    [self keyWindow].bounds = CGRectMake(0, offset, [self keyWindow].frame.size.width,[self keyWindow].frame.size.height);
}

@end


0

공유하기에는 너무 늦었지만 누군가에게 도움이 될 수있는 무언가가 있습니다. UINavigationBar를 서브 클래스로 만들려고했는데 검정색 상태 표시 줄과 상태 표시 줄 텍스트가 흰색 인 iOS 6처럼 보이게하려고했습니다.

여기 내가 그 일을 찾은 것이 있습니다.

        self.navigationController?.navigationBar.clipsToBounds = true
        self.navigationController?.navigationBar.translucent = false
        self.navigationController?.navigationBar.barStyle = .Black
        self.navigationController?.navigationBar.barTintColor = UIColor.whiteColor()

내 상태 표시 줄 배경을 검은 색으로, 상태 표시 줄 텍스트를 흰색으로 만들고 탐색 모음의 색상을 흰색으로 만들었습니다.

iOS 9.3, XCode 7.3.1

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