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

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내가 진짜 해결책 것을 고려하지 않도록 방법,하지만 해결 방법이 문제를 피할 수있는 바로 가기가 있습니다.



답변

이것은 내가 작성한 블로그 게시물 에서 교차 게시 되었지만 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를 시도하지 않도록 매우 열심히 노력하고 있습니다. 그들은 우리가 상태 표시 줄을 밑받침하기 위해 모든 앱을 다시 디자인하기를 원합니다. 그러나 사용자 경험과 기술적 이유로 인해 이것이 항상 좋은 생각이 아닌 이유에 대해 많은 논쟁이 있습니다. 사용자에게 가장 적합한 것을 수행해야하며 단순히 플랫폼의 기발한 행동을 따르지 않아야합니다.


답변

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!


답변

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

이 업데이트는 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에 대해 “자동 레이아웃 사용”을 선택 취소 한 경우에만 나타납니다.

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


답변

해결책 :

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

-(BOOL) prefersStatusBarHidden
    {
        return YES;
    }


답변

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

골:

이 접근법의 목표는 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를 볼 때이 추가보기가 즉시 표시되지 않는다는 사실입니다. ” 스토리 보드의 문서 개요 “


답변

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

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


답변