iOS 7-상태 표시 줄이보기와 겹침


109

나는이 ViewController돌며이다 UINavigationcontroller, 그러나 내비게이션 바는 숨겨져 있습니다. iOS 7에서 앱을 실행하면보기 상단에 상태 표시 줄이 표시됩니다. 이것을 피할 수있는 방법이 있습니까?

OS 별 코드를 작성하고 싶지 않습니다.

여기에 이미지 설명 입력

로 설정 View controller-based status bar appearance을 시도했지만 NO문제가 해결되지 않았습니다.


iOS 7에서 iOS 6과 같은 상태 표시 줄을 표시하는 내 답변을 게시했습니다. stackoverflow.com/questions/18294872/…
Desert Rose

2
상태 표시 줄 문제를 처리하기 위해 y 원점 및 델타 값도 조정해야합니다. 이는 stackoverflow.com/q/18980925/1545180
Ganapathy 2013 년

답변:


95

Xcode 5는 iOS 6/7 Deltas이 문제를 해결하기 위해 특별히 제작되었습니다. 스토리 보드에서 iOS 7에서 제대로 보이도록 뷰를 20 픽셀 아래로 이동했고 iOS 6과 호환되도록 Delta y하기 위해 -20으로 변경 했습니다.

여기에 이미지 설명 입력

내 스토리 보드가 자동 레이아웃을 사용하지 않기 때문에, 아이폰 OS 6 I에서 제대로 뷰의 높이의 크기를 조정하기 위해 설정했다 Delta height뿐만 아니라 Delta Y.


8
답변은 맞지만 4 인치 디스플레이에서는 작동하지 않습니다. 4 인치 디스플레이에서도 작동하도록 할 수 있으면 답변을 업데이트하세요. 미리 감사드립니다.

2
@AnkitMehta 나는 4 "아이폰에 대해 아무것도 특정 할 필요가 없습니다 않았다
aryaxt

5
나를 위해 일했습니다. 이 델타를 보려면 스토리 보드의 'Identity and Type'에서 'Use Autolayout'을 선택 취소해야합니다.
marsant

2
∆Y에 -20을 설정하는 것 외에 +20을 ∆Height로 설정해야한다는 것을 알게되었습니다
Toland Hon

3
상태 표시 줄 높이가 변경되면 어떻게됩니까? 사용자는 등 핫스팟을 활성화 할 때 F.ex : .... 다음 높이 ... 40px입니다
루카스

69

상태 표시 줄을 전혀 원하지 않는 경우 다음 데이터로 plist를 업데이트해야합니다. 이렇게하려면 plist에서 다음 두 가지 설정을 추가합니다.

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

iOS 7에서는 오버레이 투명 상태 표시 줄을 염두에두고 앱을 디자인해야합니다. 예를 들어 새로운 iOS 7 날씨 앱을 참조하십시오.


3
이것은 의도 된 방식으로 핵심에서 문제를 해결하기 때문에 실제로 유일한 좋은 대답입니다. 그래서 : 업 보트가 필요합니다!
eleven59

5
상황에 따라 적절할 수 있지만 상태 표시 줄을 숨기려면 매우 조심해야합니다. 미디어 플레이어 또는 이미지 뷰어와 같이 정당하게 전체 화면 인보기에만 해당됩니다.
smileBot

1
@ eleven59, 당신은 애플의 독재자들이 의도하는 방식을 의미합니다.
JohnK

1
뷰 컨트롤러의 오프셋을 변경하는 것보다 확실히 더 좋습니다.
벤자민 오만

상태 표시 줄을 숨기는 것은 좋은 생각이 아닙니다 ... iOS 7을 처리하는 가장 쉬운 방법이라는 것을 알고 있지만 타이밍이 필요합니다 ...
파힘 Parkar

43

이것은 UIViewControlleriOS 7의 기본 동작입니다 .보기는 전체 화면이되며 이는 상태 표시 줄이보기의 상단을 덮을 것임을 의미합니다.

당신이있는 경우 UIViewControllerUINavigationController와 내비게이션 바는 볼 수, 당신은 당신의 다음 코드를 가질 수 viewDidLoad또는 내비게이션 바 트릭을 할 배경 이미지를 가지고있다.

self.edgesForExtendedLayout = UIRectEdgeNone;

navigationBar를 숨긴 경우 20 포인트를 이동하여 모든 UIView 요소를 조정해야합니다. 다른 해결책은 보이지 않습니다. 자동 레이아웃을 사용하면 조금 도움이됩니다.

이전 버전과의 호환성을 원하는 경우 iOS 버전을 감지하는 샘플 코드는 다음과 같습니다.

NSUInteger DeviceSystemMajorVersion() {
    static NSUInteger _deviceSystemMajorVersion = -1;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        NSString *systemVersion = [UIDevice currentDevice].systemVersion;
        _deviceSystemMajorVersion = [[systemVersion componentsSeparatedByString:@"."][0] intValue];
    });

   return _deviceSystemMajorVersion;
}

18
시스템 버전을 가져오고 구문 분석하고 비교하는 대신 사용하는 것이 좋습니다.if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
Sebastian Hojas

15

내가 만든 유일한 솔루션입니다.

내 UIViewController 하위 클래스 https://github.com/comonitos/ios7_overlaping

UIViewController의 하위 클래스 1 개

2 해당 클래스에서 window.rootViewController를 하위 클래스로 지정합니다.

3 짜잔!

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect screen = [[UIScreen mainScreen] bounds];
        if (self.navigationController) {
            CGRect frame = self.navigationController.view.frame;
            frame.origin.y = 20;
            frame.size.height = screen.size.height - 20;
            self.navigationController.view.frame = frame;
        } else {
            if ([self respondsToSelector: @selector(containerView)]) {
                UIView *containerView = (UIView *)[self performSelector: @selector(containerView)];

                CGRect frame = containerView.frame;
                frame.origin.y = 20;
                frame.size.height = screen.size.height - 20;
                containerView.frame = frame;
            } else {
                CGRect frame = self.view.frame;
                frame.origin.y = 20;
                frame.size.height = screen.size.height - 20;
                self.view.frame = frame;
            }
        }
    }
}

4 [self.window makeKeyAndVisible] 바로 뒤에 상태 표시 줄을 흰색으로 만들려면 이것을 추가합니다. !!!

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

그러나 이것은 :( ... ... 가장 큰 단점 상단에 시간이 표시되지 않습니다
파힘 Parkar

훌륭하게 작동하지만 4 단계에서는 setStatusBarStyle이 더 이상 사용되지 않고 기본 작업이 아무것도하지 않는 것이기 때문에보기 컨트롤러에서 preferredStatusBarStyle을 사용해야합니다. stackoverflow.com/a/19014724/1192732
CpnCrunch

13
-(UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

-(void)viewWillLayoutSubviews{

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
  {
    self.view.clipsToBounds = YES;
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenHeight = 0.0;
    if(UIDeviceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
        screenHeight = screenRect.size.height;
    else
        screenHeight = screenRect.size.width;
    CGRect screenFrame = CGRectMake(0, 20, self.view.frame.size.width,screenHeight-20);
    CGRect viewFrame1 = [self.view convertRect:self.view.frame toView:nil];
    if (!CGRectEqualToRect(screenFrame, viewFrame1))
    {
        self.view.frame = screenFrame;
        self.view.bounds = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    }
  }
}

plist에 키 추가 ---보기 컨트롤러 기반 상태 표시 줄 모양 : 아니요


필요한 경우 창 색상 변경
Darshit Shah

고마워, 내 중복 문제를 해결했습니다. 그러나 여전히 한 가지 문제가 있습니다. 컨트롤러 기반 상태 표시 줄보기 : 아니요는 상태 표시 줄을 숨기는 것입니다. 하지만 YES로 설정하면 상태 표시 줄이 표시되지 않고 NO로 설정하면 상태 표시 줄이 표시됩니다. 그래서 plz는 내가 개념이나 무엇을 잘못했다고 말합니까?
Nayan

1
didFinishLaunchingWithOptions 'self.window.backgroundColor = [UIColor blueColor];'에 설정된 기본 반투명 색상을 사용하기 때문에 생각합니다. 및 PLIST보기 컨트롤러 기반 상태 표시 줄 모양의 YES로 설정
Darshit 샤

감사합니다! 또한 if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_6_1) {} else {}로 확인하는 경우 Apple 문서가 권장하는 것을 지적합니다. 건배!
Joel Balmer 2014

대단히 감사합니다. 귀하의 코드는 우리에게 매우 도움이됩니다. viewWillLayoutSubviews 함수에 대해 설명이 필요합니다.
user3182143

4

ios7에서 상태 표시 줄을 숨기려면 다음 간단한 단계를 따르세요.

Xcode에서 " Resources"폴더로 이동하여 " (app name)-Info.plist file"를 엽니 다 .

  • " View controller based status bar appearance"키를 확인 하고 값을 " NO"로 설정하십시오.
  • " Status bar is initially hidden"키를 확인 하고 값을 " YES"로 설정하십시오.

키가 없으면 information property list상단에서 " "를 선택 하고 + 아이콘을 클릭 하여 추가 할 수 있습니다.


질문을 명확하게 읽으십시오. 그는 상태 표시 줄을 완전히 숨기라고 요청하지 않았습니다.
ShayanK 2014 년

1
@AspersionCast : 그는 "이것을 피할 방법이 있습니까?"라고 물었습니다. 그리고 이것은 그것을 피하는 방법 중 하나입니다.
디프 Pasbola


3

xibs를 사용 하는 경우 매우 쉬운 구현은 뷰 계층 구조가 다음과 같이 보이도록 크기 조정 플래그 (이미 3.5 "및 4"호환성을 위해 사용하게 될)를 사용하여 컨테이너 뷰 내부의 모든 하위 뷰를 캡슐화 하는 것 입니다.

xib 계층 구조

그런 다음에서 다음 viewDidLoad과 같이하십시오.

- (void)viewDidLoad
{
  [super viewDidLoad];
  // initializations
  if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) // only for iOS 7 and above
  {
    CGRect frame = containerView.frame;
    frame.origin.y += 20;
    frame.size.height -= 20;
    containerView.frame = frame;
  }
}

이렇게하면 iOS 7 호환성을 위해 펜촉을 수정할 필요가 없습니다. 배경이 있으면 외부에 containerView두고 전체 화면을 덮을 수 있습니다 .


3

이것은 상태 표시 줄을 제거하는 데 필요한 전부입니다. 여기에 이미지 설명 입력


2

탐색 모음의 경우 :

이 코드 작성 :

self.navigationController.navigationBar.translucent = NO;

나를 위해 트릭을 했어요.


1

Vincent의 답변 edgeForExtendedLayout이 저에게 효과적이었습니다.

이 매크로는 OS 버전을 결정하는 데 도움이되므로

// 7.0 and above 
#define IS_DEVICE_RUNNING_IOS_7_AND_ABOVE() ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) 

// 6.0, 6.0.x, 6.1, 6.1.x
#define IS_DEVICE_RUNNING_IOS_6_OR_BELOW() ([[[UIDevice currentDevice] systemVersion] compare:@"6.2" options:NSNumericSearch] != NSOrderedDescending) 

이 매크로를 프로젝트의 prefix.pch 파일에 추가하고 어디서나 액세스 할 수 있습니다.

if(IS_DEVICE_RUNNING_IOS_7_AND_ABOVE())
{
 //some iOS 7 stuff
 self.edgesForExtendedLayout = UIRectEdgeNone;
}

if(IS_DEVICE_RUNNING_IOS_6_OR_BELOW())
{
 // some old iOS stuff
}

1
나를 위해 self.edgesForExtendedLayout = UIRectEdgeNone; 작동하지 않습니다 ... 이유가 무엇입니까?
Fahim Parkar 2013 년

1

나는 이것과 같은 질문으로 다른 게시물에 대한 내 답변을 게시했습니다.

Apple iOS7 전환 가이드에서 https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1

특히 automaticallyAdjustsScrollViewInsets=YESset self.edgesForExtendedLayout = UIRectEdgeNone나를위한 작품 나는 중복 싶지 않고 내가있을 때 tableviewcontroller.


0

"자동 레이아웃 사용"을 어떤 비용 으로든 활성화하려면 viewdidload에 다음 코드를 배치하십시오.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
{
        self.edgesForExtendedLayout = UIRectEdgeNone;
        self.extendedLayoutIncludesOpaqueBars = NO;
        self.automaticallyAdjustsScrollViewInsets = NO;
}

0

YTPlayer의 가로보기에서 돌아온 후 내 상태 표시 줄과 탐색 표시 줄이 겹칩니다. @comonitos 버전을 시도한 후 내 솔루션이 있지만 iOS 8에서는 작동하지 않습니다.

- (void)fixNavigationBarPosition {
    if (self.navigationController) {
        CGRect frame = self.navigationController.navigationBar.frame;
        if (frame.origin.y != 20.f) {
            frame.origin.y = 20.f;
            self.navigationController.navigationBar.frame = frame;
        }
    }
}

내비게이션 바의 위치를 ​​고정하고 싶을 때마다이 함수를 호출하면됩니다. 나는 YTPlayerViewDelegate의playerView:didChangeToState:

- (void)playerView:(YTPlayerView *)playerView didChangeToState:(YTPlayerState)state {
    switch (state) {
        case kYTPlayerStatePaused:
        case kYTPlayerStateEnded:
            [self fixNavigationBarPosition];
            break;
        default:
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.