programing

iPhone 앱에서 iOS 7 상태 표시줄을 iOS 6 기본 스타일로 되돌리나요?

padding 2023. 4. 23. 10:07
반응형

iPhone 앱에서 iOS 7 상태 표시줄을 iOS 6 기본 스타일로 되돌리나요?

에서는 iOS 7의UIStatusBar.

Tina Tavchar가 설계한 GUI(Tina Tavchar가 설계한 GUI)

  • 쿨하지만 뷰의 맨 위에 있는 것이 있으면 뷰가 약간 흐트러져 상태 표시줄과 겹칩니다.

  • info.plist에서 속성을 설정하는 등 iOS6에서 동작하는 방법을 [중복하지 않음]으로 되돌릴 수 있는 간단한 솔루션이 있습니까?

  • 좀 더 간단한 해결방법은,self.view.center.x 뷰마다 + 이지만, 그것들을 + 1차원 20점, 차원이 있음)이self.view.center.x커스텀 세그먼트(segues)에 문제가 생길 수 있습니다.)가 갑자기 귀찮은 일이 되어 버립니다.

  • 이 문제에 대한 원라이너 솔루션을 제공해 주시면 정말 감사하겠습니다.

P.S. 상태 표시줄을 숨길 수 있습니다.

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

»didFinishLaunchingWithOptions방법은 회피책이며 문제를 회피하는 지름길이기 때문에 진정한 해결책은 아니라고 생각합니다.

이것은 가 쓴 블로그 투고에서 크로스 투고된 것입니다만, iOS 7의 상태 바, 네비게이션 바, 컨테이너 뷰 컨트롤러에 대한 자세한 내용은 다음과 같습니다.

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

  2. 상태 표시줄 모양과 상태 표시줄 레이아웃을 혼동하지 마십시오.외관(조명 또는 기본값)은 상태 표시줄 배치 방법(프레임/높이/중첩)에 영향을 주지 않습니다.또한 시스템 상태 표시줄에 배경색이 없습니다.API가 UIStatusBarStyleLightContent를 참조할 경우 클리어 배경의 흰색 텍스트를 의미합니다.UIStusBarStyleDefault는 클리어 배경에 검은색 텍스트입니다.

  3. 상태 표시줄 모양은 서로 배타적인 두 가지 기본 경로 중 하나를 따라 제어됩니다. 즉, 기존 방식으로 프로그래밍 방식으로 설정할 수도 있고, UIKit에서 UIViewController의 새로운 속성을 기반으로 모양을 업데이트합니다.후자 옵션은 기본적으로 켜져 있습니다.사용 중인 "ViewController 기반 상태 표시줄 모양"에 대한 앱의 목록 값을 확인하여 사용 중인 항목을 확인합니다.이 값을 YES로 설정하면 앱의 모든 최상위 보기 컨트롤러(표준 UIKit 컨테이너 보기 컨트롤러 제외)가 preferredStatusBarStyle을 재정의하여 기본 스타일 또는 가벼운 스타일을 반환해야 합니다.plist 값을 NO로 편집하면 익숙한 UIApplication 방법을 사용하여 상태 표시줄 모양을 관리할 수 있습니다.

  4. UINavigation Controller는 UINavigation Bar의 높이를 다소 이상하고 문서화되어 있지 않은 제약조건 세트에 따라 44포인트 또는 64포인트로 변경합니다.UINavigationController는 뷰의 프레임 상단이 UIWindow의 상단과 시각적으로 인접해 있는 것을 검출하면 64포인트의 높이로 네비게이션 바를 그립니다.뷰의 상단이 UIWindow의 상단과 인접하지 않은 경우(1점만 떨어져 있어도) 44점의 높이로 "기존" 방식으로 네비게이션 바를 그립니다.이 로직은 어플리케이션의 뷰 컨트롤러 계층 내에 여러 개의 하위 항목이 있더라도 UINavigation Controller에 의해 수행됩니다.이 동작을 막을 방법은 없습니다.

  5. 높이 44포인트(88픽셀)에 불과한 커스텀네비게이션 배경 이미지를 제공하고 UINavigationController의 뷰가 UIIndow의 경계(4번 참조)와 일치하는 경우 UINavigationController는 사용자 정의 불투명 이미지 프레임(0,20,320,44)에 이미지를 그립니다.이것은 당신이 규칙 1을 무시한 영리한 개발자라고 착각하게 만들 수 있지만, 당신은 틀렸습니다.네비게이션 바의 높이는 아직 64포인트입니다.UINavigation Controller를 슬라이드 투 리뷰 형식의 뷰 계층에 포함시키면 이 점이 매우 명확해집니다.

  6. UIViewController의 edges For Extended Layout 속성이 혼동될 수 있으므로 주의하십시오.edgesForExtendedLayout을 조정하면 대부분의 경우 아무 작업도 수행되지 않습니다.UIKit에서 이 속성을 사용하는 유일한 방법은 뷰 컨트롤러를 UINavigationController에 추가하는 경우 UINavigationController는 edgesForExtendedLayout을 사용하여 하위 뷰 컨트롤러를 탐색 모음/상태 표시줄 영역 아래에 표시할지 여부를 결정하는 것입니다.UINavigationController 자체에 edgesForExtendedLayout을 설정해도 UINavigationController에 44포인트 또는 64포인트 높이의 네비게이션바 영역이 있는지 여부는 변경되지 않습니다.이 논리에 대해서는, #4 를 참조해 주세요.툴바 또는 UITAbBarController를 사용할 때 뷰 하단에 유사한 레이아웃 로직이 적용됩니다.

  7. UINavigationController 내에서 커스텀자녀 뷰 컨트롤러가 네비게이션 바를 언더랩하지 않도록 하려면 edgesForExtendedLayout을 UIRectEdgeNone(또는 적어도 UIRectEdgeTop을 제외하는 마스크)으로 설정합니다.뷰 컨트롤러의 수명 주기에서 가능한 빨리 이 값을 설정하십시오.

  8. UINavigation Controller와 UITAbBar Controller도 콘텐츠 패딩을 시도합니다.하위 뷰 계층의 테이블 뷰 및 컬렉션 뷰 세트.이것은 #4의 상태 바 로직과 유사한 방식으로 수행됩니다.자동으로 AdjustsScrollView를 설정하여 이를 방지하는 방법이 있습니다.테이블 뷰 및 컬렉션뷰에 대해 [아니오(NO)]으로 설정합니다(기본값은 [예(YES)위스퍼와 Riposte는 콘텐츠를 사용하기 때문에 이 때문에 심각한 문제가 발생하였습니다.조정 기능을 삽입하여 도구 모음 및 키보드 이동에 따라 테이블 뷰의 레이아웃을 제어합니다.

  9. 다시 말씀드리지만 iOS 6 스타일의 상태 표시줄 레이아웃 로직으로 돌아갈 방법은 없습니다.이를 대략적으로 표현하기 위해서는 앱의 모든 뷰 컨트롤러를 화면 상단에서 20포인트 정도 오프셋된 컨테이너 뷰로 이동해야 하며, 상태 표시줄 뒤에 의도적으로 검은색 뷰를 남겨 이전 모양을 시뮬레이션해야 합니다.이것이 Riposte와 Whisper에서 사용한 방법입니다.

  10. 애플은 당신이 9번을 시도하지 않도록 하기 위해 매우 노력하고 있다.상태 표시줄 아래에 표시되도록 모든 앱을 재설계해 달라고 합니다.그러나 사용자 경험과 기술적 이유 모두에서 이것이 항상 좋은 생각은 아닌지에 대한 많은 설득력 있는 주장이 있습니다.단순히 플랫폼의 변덕을 따르지 말고 사용자를 위해 최선의 방법을 강구해야 합니다.

2013년 9월 19일 갱신:

하고, 「」를 추가했습니다.self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);

를 고치다NSNotificationCenter 「」


2013년 9월 12일 갱신:

UIViewControllerBasedStatusBarAppearance로로 합니다.NO

화면 회전이 가능한 앱용 솔루션 추가

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


iOS7 상태 표시줄을 iOS6에서 작동하는 방식으로 되돌릴 방법은 없는 것 같습니다.

단, 몇 가지 코드를 작성하여 상태 표시줄을 iOS6처럼 만들 수 있습니다.이것이 제가 생각할 수 있는 가장 빠른 방법입니다.

  1. ★★UIViewControllerBasedStatusBarAppearance로로 합니다.NOinfo.plist(UIApplication statusBarStyle 메서드를 사용하여 상태 표시줄 스타일을 설정할 수 있도록 뷰 컨트롤러가 상태 표시줄 스타일을 조정하는 것을 피합니다.)

  2. AppDelegate에서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 상태 표시줄 착각을 생성합니다.


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

더하다

 @property (retain, nonatomic) UIWindow *background;

AppDelegate.h 만들다backgroundARC의 할당 해제를 방지합니다(ARC를 사용하지 않는 경우 이 작업을 수행할 필요가 없습니다).

UI에서 를 생성하기만 하면 됩니다.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 내비게이션 바 문제를 해결하는 최선의 방법입니다.네비게이션 바의 색상 예를 다음과 같이 설정할 수 있습니다.Fake Nav Bar.background Color = [ UICollor red Color ];

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

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 Delta는 세부 정보 창의 "파일 인스펙터"(맨 왼쪽 아이콘)에서 View Controller의 "Use Autolayout"(자동 레이아웃 사용)을 클릭합니다.

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

해결책:

메서드를 덮어쓰고 뷰컨트롤러 또는 루트뷰컨트롤러로 설정합니다.

-(BOOL) prefersStatusBarHidden
    {
        return YES;
    }

Storyboard를 폭넓게 활용하는 프로젝트의 또 다른 접근법은 다음과 같습니다.

목표:

이 접근법의 목표는 iOS6에서와 동일한 상태 표시줄 스타일을 iOS7에서 재현하는 것입니다(질문 제목 "iOS 7 상태 표시줄 Back to iOS 6 style?" 참조).

요약:.

이를 위해 Storyboard는 가능한 한 상태 표시줄(iOS 7 아래)에 겹치는 UI 요소를 아래쪽으로 이동시키고, 델타를 사용하여 iOS 6.1 이전 버전의 아래쪽 레이아웃 변경을 되돌립니다.그 결과 iOS 7의 여분의 공간은 UIView가 차지하고 background Color는 우리가 선택한 색상으로 설정됩니다.후자는 코드 또는 스토리보드를 사용하여 작성할 수 있습니다(아래 대안 참조).

전제 조건:

때 는 '보다 낫다'라고 합니다.View controller-based status bar appearance[(NO)]로.Status bar style투 「 Opaque black 타로로로로로로로로로로로로로로로로로로로로로로로로로로 。두 설정 모두 프로젝트 설정의 "정보"에서 찾거나 추가할 수 있습니다.

순서:

  • 상태 표시줄 배경으로 사용할 하위 보기를 UI 창에 추가합니다.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 Deltas"가 Size Inspector에 표시되지 않기 때문입니다).이업을을수수행:업 :
      • 스토리보드 파일 선택
      • show 유틸리티
      • "파일 검사기 표시"를 선택합니다.
      • "Interface Builder Document"에서 "Use Autolayout"을 선택 취소합니다.
    • 7할 수 " 에디터하고 " 및 6.1을 선택합니다여기에 이미지 설명 입력 여기에 이미지 설명 입력
    • 이제 상태 표시줄과 겹치지 않도록 조정할 UI 요소를 선택하십시오.
    • 유틸리티 열에서 "Size Inspector 표시"를 선택합니다.
    • 상태 표시줄 높이와 합니다. UI "Y" "Y" "Y" "Y" "Y" "Y" "BG" "BG" "Y" "Y" "BG" "Y" "Y" "Y" "BG" "Y" "BG"여기에 이미지 설명 입력
    • 또한 Y에 대한 iOS6/7 Deltas 값을 상태 표시줄 bg 높이와 같은 음의 양만큼 변경합니다(사용 중인 경우 iOS 6 미리보기의 변경 사항 참고). 여기에 이미지 설명 입력

대체 방법:

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

이 대안의 단점(자동화 호환성을 고려할 때 무시할 수 있지만)은 iOS 6용 스토리보드를 보고 있으면 이 추가 뷰가 바로 표시되지 않는다는 것입니다. 스토리보드의 "문서 개요"를 봐야만 추가 뷰가 있다는 것을 알 수 있습니다.

뷰 컨트롤러를 상태 표시줄(및 탐색 표시줄)과 겹치지 않으려면 Xcode 5의 인터페이스 빌더에서 "상단 막대의 가장자리 확장" 상자를 선택 취소합니다.

상단 바 아래 가장자리 연장 체크 마크를 제거합니다.

애플은 테크니컬 Q&A QA1797: 상태 표시줄이 사용자의 뷰커버하는 것을 방지합니다.iOS 6 및 iOS 7 버전에서 올바르게 작동합니다.

나는 이 빌어먹을 문제를 해결하기 위해 많은 튜토리얼을 봐왔다.근데 하나도 안 먹혀!다음과 같은 솔루션을 사용할 수 있습니다.

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;
    }
}

논리는 간단하다.나는 모든 아이들의 자아에 대한 관점을 바꾼다.20픽셀로 표시.그게 다예요.그러면 iOS 6과 마찬가지로 스크린샷이 표시됩니다.iOS7 상태 표시줄이 싫어!~"~"~

Archy Holt의 답변에 대한 작은 대안으로, 조금 더 심플합니다.

a.를 설정합니다.UIViewControllerBasedStatusBarAppearance로로 합니다.NO.plist(영어)에서

b. 력력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;
}

도 고려해 볼 수 .UIWindowUIApplicationDidChangeStatusBarOrientationNotification그 자체입니다.

모든 뷰 컨트롤러에서 사용했는데 간단합니다.모든 viewDidLoad 메서드에 다음 행을 추가합니다.

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

    [super viewDidLoad];
}

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

순서 1: 싱글로 변경하려면viewController

[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];

순서 2: 어플리케이션 전체를 변경하려면

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

순서 3: 이것도 각각에 추가한다.viewWillAppearstatusbar의 for 의 입니다.iOS7

    [[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];
    }

Interface Builder에는 오프셋 문제를 해결하기 위한 iOS 6/7 Delta 속성을 호출하는 옵션이 있습니다.

Stack Overflow 질문 Interface Builder를 참조하십시오. UIView의 Layout iOS 6/7 Delta는 사용합니까?

iOS7의 iOS6와 같은 상태 바를 실현했습니다.

info.plist에서 UIViewControllerBasedStatusBarAppliance를 NO로 설정합니다.

를 「」에 페이즈 합니다.- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 법 method

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);
}

이십 명 있는 다음 하여 건너오다-(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 메서드에서 창 할당 후 사용자 기본값 높이 설정

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

Interface Builder 를 사용하고 있는 경우는, 다음의 조작을 시험해 주세요.

xib 파일에서:

1) 메인 뷰를 선택하고 배경색을 검은색(또는 상태 표시줄을 원하는 색)으로 설정합니다.

2) 배경이 컨트롤러 뷰의 최상위 하위 레벨로 배치된 자체 포함 하위 뷰인지 확인합니다.
배경을 이동하여 컨트롤러 뷰의 직접 하위 항목이 됩니다.자동 크기 조정 패널이 모든 프레임 가장자리를 잠갔는지, 두 개의 플렉시블 축을 모두 활성화했는지 확인하고, UIImageView인 경우 콘텐츠 모드를 Scale to fill로 설정합니다.는 (| )로됩니다.Flexible Width | UIView Autoresize유연)을 사용하다.★★★★★★★★★★★★★★★★★★」

3)67 델타 -20.3으로 합니다.) 6/7은 Y-20으로 설정합니다.
오토사이징 패널의 상단 프레임에 잠겨 있는 상위 레벨의 아이들은 모두 20포인트 아래로 이동하고 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

은 ★★★★★★★★★★★★★★★★★★★★★★★★.UIView 창 합니다.iOS 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]필요할 때.

프레임을 직접 조작할 수 없게 되었기 때문에 자동 레이아웃을 사용하는 경우, 이것은 매우 큰 문제가 될 수 있습니다.손이 많이 가지 않는 간단한 해결책이 있다.

메서드를 하고 뷰 의 모든했습니다.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을 사용하다오토레이아웃의 부담을 덜어줄 거예요.

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

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

오래된 SDK를 최신 Xcode에 설치하는 방법

  1. iOS 6.1 SDK는 http://www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.html에서 입수할 수도 있고 오래된 X코드를 다운로드하여 콘텐츠에서 SDK를 입수할 수도 있습니다.

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

  3. xcode를 재기동합니다.

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

도움이 되길 바랍니다.효과가 있었어 =)

「 」를 사용하고 .presentViewController:animated:completion:으로 만들다window.rootViewController.view저는 이 문제에 대해 다른 접근법을 찾아야 했습니다. 및 시킬 수 있게 .

.h

@interface RootView : UIView

@end

.m

@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 애니메이션에 대한 강력한 해결 방법이 있습니다.

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

-> '다 하다 -> 하다'로 이동해 주세요.info.plist상태 표시줄 스타일 파일링 및 추가 -> 투과적 검정 스타일(0.5의 Alpha

자, 갑니다.-

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;
   }

매우 간단한 솔루션(수직 방향만 지원한다고 가정함)은 앱 위임 didFinishLaunchingWithOptions 메서드에서 7 이하의 iOS 버전에 대한 애플리케이션 창 경계를 재정의하는 것입니다.

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];
}

상태 표시줄을 모두 숨길 수 있습니다.그러면 앱이 전체 화면으로 표시됩니다.그게 최선인 것 같아요.

UIStatusBarStyleNone또는 타겟 설정으로 설정합니다.

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

1. 어플리케이션 info.plist 파일로 이동합니다.

2. 컨트롤러 기반의 상태 바아피아란스를 설정, 표시: 부울 NO

상태 표시줄 문제를 해결했으면 좋겠는데...

setStatusBar를 계속 사용하려면숨김: 이 카테고리를 사용합니다.

@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

iOS7에서 이 네비게이션 바 문제에 대한 최적의 대안과 솔루션을 찾았습니다!!

http://www.appcoda.com/customize-navigation-status-bar-ios-7/

나는 그것이 우리의 모든 의문과 걱정을 해결해 주길 바란다.

공유하기엔 너무 늦었을 수도 있지만 누군가에게 도움이 될 만한 기여가 있습니다.저는 UINavigation Bar를 서브클래스로 하려고 했습니다.또한 검은색 상태 표시줄과 흰색 상태 표시줄 텍스트가 있는 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

언급URL : https://stackoverflow.com/questions/18294872/ios-7-status-bar-back-to-ios-6-default-style-in-iphone-app

반응형