iOS 7에서 상태 표시 줄 및 탐색 표시 줄이 내보기의 경계 위에 나타납니다.


435

최근 에 iOS 7에서 내 앱을 테스트하기 위해 Xcode 5 DP를 다운로드했습니다 . 가장 먼저 확인하고 확인한 것은 상태 표시 줄과 탐색 표시 줄을 고려하여보기의 경계가 항상 크기 조정되지는 않는다는 것입니다.

에서 viewDidLayoutSubviews, 나는 뷰의 경계를 인쇄 :

{{0, 0}, {320, 568}}

이로 인해 내 컨텐츠가 탐색 표시 줄 및 상태 표시 줄 아래에 나타납니다.

메인 화면의 높이를 가져 와서 상태 표시 줄의 높이와 탐색 표시 줄의 높이를 빼면 키를 직접 계산할 수 있지만 불필요한 추가 작업처럼 보입니다.

이 문제를 어떻게 해결할 수 있습니까?

최신 정보:

이 특정 문제에 대한 해결책을 찾았습니다. 탐색 모음의 반투명 속성을 NO로 설정하십시오.

self.navigationController.navigationBar.translucent = NO;

탐색 표시 줄과 상태 표시 줄 아래에 프레임이 표시되지 않도록 수정합니다.

그러나 탐색 막대를 반투명하게하려는 경우에 대한 수정 사항을 찾지 못했습니다. 예를 들어, 사진을 전체 화면으로 볼 때 탐색 모음을 반투명하게 만들고 그 아래에보기 프레임을 만들고 싶습니다. 작동하지만 탐색 모음 표시 / 숨기기를 전환하면 이상한 결과가 발생했습니다. 첫 번째 하위 뷰 (UIScrollView)는 매번 변경되는 원점 범위를 가져옵니다.


또한 DP 엑스 코드 5에서 동일한 문제가 무엇입니까
— Gopesh 굽타

해결책을 얻을 수 있는지 알려주세요
— Gopesh Gupta

1
탐색 표시 줄에서 색조 색상 특성을 찾으면 원하는대로 파란색을 변경할 수 있어야합니다.
— beebcon

9
Apple이 앱의 하위 호환성을 유지할 수있는 기회를주지 않았기 때문에 때때로 iOS 업그레이드가 싫어요.
— Bagusflyer 2014 년

3
문제는 @Stunner으로 내가 대답을 참조 할 것 네비게이션 컨트롤러 상단 표시 줄을 숨기고 후 상태 표시 줄 아래에가는보기와 관련된 경우 stackoverflow.com/a/18976660/235206 솔루션으로
— MiKL

답변:


495

edgesForExtendedLayoutiOS7 SDK에서 새로운 속성을 구현하여이를 달성 할 수 있습니다 . 이를 위해 다음 코드를 추가하십시오.

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

-(void)viewDidLoad메소드에 위의 내용을 추가해야합니다 .

iOS 7에서는 UI 모양을 레이아웃하고 사용자 정의하는 방법에 몇 가지 변경 사항이 있습니다 . 뷰 컨트롤러 레이아웃, 색조 색상 및 글꼴의 변경 사항은 앱의 모든 UIKit 객체에 영향을줍니다 . 또한 제스처 인식기 API가 향상되어 제스처 상호 작용을보다 세밀하게 제어 할 수 있습니다.

뷰 컨트롤러 사용

iOS 7에서 뷰 컨트롤러는 전체 화면 레이아웃을 사용합니다. 동시에 iOS 7을 사용하면 뷰 컨트롤러가 뷰를 배치하는 방식을보다 세밀하게 제어 할 수 있습니다. 특히 전체 화면 레이아웃 개념은보기 컨트롤러가보기의 각 가장자리 레이아웃을 지정할 수 있도록 개선되었습니다.

wantsFullScreenLayout현재 지정하면 뷰 컨트롤러 속성은 아이폰 OS 7에 사용되지 wantsFullScreenLayout = NO는 아이폰 OS 7에서 실행될 때, 뷰 컨트롤러가 예기치 않은 화면 위치에 내용을 표시 할 수 있습니다.

뷰 컨트롤러가 뷰를 배치하는 방법을 조정하려면 UIViewController 다음 속성을 제공하십시오.

  • edgeForExtendedLayout

이 edgesForExtendedLayout속성은 UIRectEdgenone과 all을 지정하는 것 외에도 사각형의 네 가장자리 각각을 지정 하는 유형을 사용합니다 . edgesForExtendedLayout막대 반투명도에 관계없이 확장해야하는 뷰의 모서리를 지정하는 데 사용 합니다. 기본적으로이 특성의 값은입니다 UIRectEdgeAll.

  • extendedLayoutInpasOpaqueBars를 포함합니다

설계에서 불투명 막대를 사용하는 경우 특성을 NO로edgesForExtendedLayout 설정하여 세분화 하십시오 . (의 기본값 은 NO 입니다.)extendedLayoutIncludesOpaqueBarsextendedLayoutIncludesOpaqueBars

  • 자동으로 ScrollViewInsets 조정

원하지 않는 경우 스크롤 뷰의 내용 세트는 자동으로 설정을 조정할 수 automaticallyAdjustsScrollViewInsets에 NO . (기본값 automaticallyAdjustsScrollViewInsets은 YES 입니다.)

  • topLayoutGuide, bottomLayoutGuide

topLayoutGuide및 bottomLayoutGuide특성은 도면 컨트롤러의 뷰의 상부 또는 하부 에지 바의 위치를 나타낸다. 막대가 뷰의 상단 또는 하단과 겹치면 Interface Builder를 사용 topLayoutGuide하여 bottomLayoutGuide 의 하단 또는 상단에 구속 조건을 작성하여 막대를 기준으로 뷰를 배치 할 수 있습니다 . 막대가 뷰와 겹치지 않아야하는 경우 하단은 topLayoutGuide뷰의 상단과 bottomLayoutGuide같고 상단은 뷰의 하단과 같습니다. 두 속성 모두 요청시 느리게 생성됩니다.

애플 독을 참조하십시오


2
iOS6에서는 컴파일되지 않습니다. 그것이 performselector로 쓰여 져야한다고 생각합니다 ...
— Shmidt

8
예, 그게 내가 가진 선택 체크를 포함 왜 조건, 만약의 경우 ([자기 respondsToSelector : @selector (edgesForExtendedLayout)])
— Nandha

19
탐색 모음이 없으면 작동하지 않습니다. 이 경우, 내보기는 상태 표시 줄 뒤에 연장 ..
— 반 뒤 트란에게

4
@VanDuTran과 같은 문제가 있습니다. 네비게이션 바가 숨겨져 있으면 edgeForExtendedLayout이 도움이되지 않습니다.
— fishinear

6
그것은 효과가 있지만 ... 더 이상 반투명 효과가 없습니다 ... 어떻게 반투명 효과를 유지할 수
— 있습니까

110

모든 것을 얼마나 멀리 떨어 뜨릴지를 계산할 필요가 없습니다.이 속성이 내장되어 있습니다. Interface Builder에서 뷰 컨트롤러를 강조 표시 한 다음 속성 관리자로 이동합니다. 여기에서 "Extend Edges"옆에 확인란이 있습니다. 보시다시피, 첫 번째 스크린 샷에서 기본 선택은 내용이 상단 및 하단 막대 아래에 표시되고 불투명 막대 아래에는 표시되지 않기 때문에 막대 스타일을 반투명하지 않도록 설정하는 것이 좋습니다.

첫 번째 스크린 샷에서 볼 수 있듯이 탐색 막대 아래에 두 개의 UI 요소가 숨겨져 있습니다. (IB에서 와이어 프레임을 사용하여이를 설명했습니다.) UIButton 및 UISegmentedControl 요소는 모두 "y"원점이 0으로 설정되어 있으며 뷰 컨트롤러는 상단 막대 아래의 콘텐츠를 허용하도록 설정되어 있습니다.

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

이 두 번째 스크린 샷은 "상단 바 아래"확인란을 선택 취소 할 때 발생하는 상황을 보여줍니다. 보다시피, 뷰 컨트롤러 뷰는 y 원점이 네비게이션 바 바로 아래에 위치하도록 적절하게 아래로 이동되었습니다.

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

또한의 사용법을 통해 프로그래밍 방식으로 수행 할 수 있습니다 -[UIViewController edgesForExtendedLayout]. 다음은 edgeForExtendedLayout 및 UIRectEdge 에 대한 클래스 참조에 대한 링크 입니다 .

[self setEdgesForExtendedLayout:UIRectEdgeNone];

15
.xib에서보기 위해 어떻게 똑같이합니까?
— bobics

2
라벨을 하나 추가하고 지시를 따랐지만 작동하지 않습니다.
— RMRAHUL

5
@bobics XIB 질문에 대한 대답은 "당신은 할 수 없습니다"입니다. 어쨌든 IB를 통하지 않습니다. 레이더를 제출하고 Apple이 결국 해결하기를 바랍니다.
— memmons

감사합니다 @ 0x7fffffff, 이것은 내가 찾던 정보 일 뿐이며 매우 유용했습니다.
— campo

33

프로그래밍 방식으로 뷰를 만들었고 결국 나에게 도움이되었습니다.

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

출처 ( 39 페이지 하단의 topLayoutGuide 섹션).


마지막으로 실제로 작동하는 답변을 찾았습니다. 잘 했어!
— StuartM

1
탐색 막대가 숨겨져있을 때 뷰 컨트롤러의보기가 상태 표시 줄 아래에 표시되는 문제를 해결하기 위해 상태 표시 줄 아래에보기를 스냅하는 코드입니다.
— MiKL

참고 : 이렇게하면 화면 하단이 화면에서 밀려납니다.
— memmons

1
또한 iOS7 전용 으로 빌드하지 않으면 위의 코드에서 오류가 발생 topLayoutGuide합니다. iOS7 전용입니다.
— memmons

1
또한 기본 뷰가 UITableView 인 경우 각 스크롤에서 viewDidLayoutSubviews가 호출됩니다. UITableView는 높이가 15px가 될 때까지 축소됩니다. 이 코드를 한 번만 실행하려면 플래그를 추가하십시오. ;)
— Thomas Johannesmeyer

30

iOS 10 이상에서 NIB / XIB 파일과 함께 작동하는 Swift 3 / Swift 4 솔루션 :

override func viewDidLoad() {
    super.viewDidLoad()

    edgesForExtendedLayout = []
}

이것이 나를 도운 것입니다 ... 너무 간단합니다. 감사합니다 :-)
— Hernan Arber

정말 도움이 주셔서 감사합니다
— Muhammad Ahmed Baig 2011

이것은 10.x Swift 3+ IMO를위한 최상의 솔루션입니다
— shokaveli

10

뷰에 반투명 탐색 막대가 표시되도록하려면 contentInset 또는 유사 항목을 설정해야합니다.

내가하는 방법은 다음과 같습니다.

// Check if we are running on ios7
if([[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."][0] intValue] >= 7) {
      CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
      float heightPadding = statusBarViewRect.size.height+self.navigationController.navigationBar.frame.size.height;

      myContentView.contentInset = UIEdgeInsetsMake(heightPadding, 0.0, 0.0, 0.0);
}

3
7.0과 직접 비교할 수없는 이유
— Leena

1
lol 나는 그것을 얻는다 : 작은 추가로 특정 버전을 검사하는 것은 덜 강력합니다. 그러나 값이 더 크거나 같은지 확인하고 있으므로 7.0과 비교하면 여기에서 잘 작동합니다.)
— EeKay

1
@leena-이것은 7.x 이상의 기능이므로 버전이 7 이상인지 확인하고 검사에서 사소한 개정을 건너 뜁니다.
— Magnus

2
내 tabbar 뒤에 tableView beeing에 문제가 있습니다. 내 테이블의 마지막 행이 탭 막대 위로 스크롤되지 않도록했습니다. myTableView.contentInset UIEdgeInsetsMake = (0, 0.0, TabbarHeight, 0) : 그처럼 고정
— 제임스 Laurenstin

contentInset의 속성입니다 UIScrollView. 만약에 나의 주요보기의 서브 클래스가 아닌 UIScrollView. 그런 다음 겹침 문제를 어떻게 해결합니까?
— Pwner

9

edgesForExtendedLayout그러나 iOS 7 SDK를 통해 앱을 빌드하고 iOS 6에 배포하면 탐색 표시 줄이 반투명으로 표시되고보기가 그 아래로 이동합니다. 따라서 iOS 7과 iOS 6 모두에서 수정하려면 다음을 수행하십시오.

self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

9

앱 plist 파일에서 행을 추가하고 "컨트롤러 기반 상태 표시 줄보기"라고하고 NO로 설정하십시오 .


7

가장 간단한 방법은 NIB 파일 을 열고 다음 두 가지 간단한 단계를 수행하는 것입니다.

  1. 그것을 토글하고 원하는 것으로 설정하십시오.

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

  1. 아래로 이동하려는 UIView / UIIMageView /를 선택하십시오. 제 경우에는 로고 만 겹쳐졌고 델타는 +15로 설정했습니다. (또는 1 단계에서 iOS 7을 선택한 경우 -15)

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

그리고 결과 :

전에 후


6
작동하지만 솔루션을 유지 관리하기 어려운 것처럼 보입니다. 패치하는 대신 문제를 해결하는 것이 가장 좋습니다.
— NLemay

메인 뷰에 적용되면 작동하지 않기 때문에 모든 뷰의 서브 뷰에 대해 프로그래밍 방식으로 수행하는 것이 가장 좋습니다.
— wildmonkey

5

스위프트 솔루션 :

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.edgesForExtendedLayout = UIRectEdge.None
}

4
이것은 이제 edgeForExtendedLayout = []
— Leon

1
이 답변은 공개 답변이므로 전화를 잊지 마십시오.super.viewWillAppear(animated)
— prodos

4

Stunner의 답변을 확장하고 ifiOS 7인지 확인 하는 명령문을 추가하고 싶습니다 .iOS 6에서 테스트 할 때 앱이 중단되기 때문입니다.

추가는 다음과 같습니다.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

따라서이 방법을 MyViewControler.m파일에 추가하는 것이 좋습니다 .

- (void) viewDidLayoutSubviews {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
    }
}

4

스위프트 3

override func viewWillAppear(_ animated: Bool) {
    self.edgesForExtendedLayout = []
}

3

Apple에서 작성한 BannerViewController를 사용하여 내 광고와 BannerViewController에 포함 된 ScrollViewController를 표시하는 시나리오가 있습니다.

내비게이션 바가 내 콘텐츠를 숨기지 못하게하려면 두 가지를 변경해야했습니다.

1) BannerViewController.m 수정

- (void)viewDidLoad
{
   [super viewDidLoad];
   float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
   if (systemVersion >= 7.0) {
      self.edgesForExtendedLayout = UIRectEdgeNone;
   }
}

2) 내 ScrollViewContoller 수정

- (void)viewDidLoad
{
    [super viewDidLoad];
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0) {
        self.edgesForExtendedLayout = UIRectEdgeBottom;
    }
}

이제 탐색 표시 줄로 가리지 않고보기 하단에 광고가 올바르게 표시되고 상단의 콘텐츠가 잘리지 않습니다.


2

다음 코드를 설정하면 나타납니다.

  if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) {
self.edgesForExtendedLayout = UIRectEdgeNone;
 }

이것이 내 상황에서 일한 유일한 것입니다.
— goobliata


2

스위프트 4.2-Xcode 10.0-iOS 12.0 :

if #available(iOS 11.0, *) {} else {
  self.edgesForExtendedLayout = []
  self.navigationController?.view.backgroundColor = .white
}

1

나에게 가장 간단한 해결책은 plist에 두 개의 키를 추가하는 것입니다.

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


+1, "상태 표시 줄이 처음에 숨겨져 있음"이 YES이지만 "컨트롤러 기반 상태 표시 줄보기"를 추가 할 때 상태 표시 줄을 제거했습니다.
— Jonas Byström

1

드롭 다운 목록에서 "컨트롤러 기반 상태 표시 줄보기"키를 행에 추가하십시오 info.plist. 이 같은:

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


interesting.it는 내 cocos2d 프로젝트에 도움이되었습니다.이 옵션을 토글하면 상단 상태 표시 줄이 완전히 사라 졌거나 나타나는 것을 볼 수 있습니다.
— Kursat Turkay

1

다른 UIViewController를 제공하여 iPad (armv7, armv7s, amr64)의 내 응용 프로그램과 동일한 문제가 있었으며 해제 한 후 상태 표시 줄 아래에 탐색 표시 줄이 나타납니다 ... 나는 그 해결책을 찾기 위해 많은 시간을 소비합니다. 스토리 보드를 사용하고 UIViewController 용 InterfaceBuilder에서 FullScreen-> Current Context에서 Presentation을 설정하면이 문제가 해결됩니다. 내 앱에서만 iPad => iOS8.0 (iOS8.1로 테스트) 및 iOS 7.1이 설치된 iPad에서는 작동하지 않습니다!스크린 샷 참조


필자의 경우 기본보기가 tabBar와 겹쳤으며 이유를 알지 못했습니다. 가장자리 확장> 아래쪽 막대 아래가 확인되었습니다. 내 앱의 배경이 흰색이고 내 tabBar에 대해 일정 수준의 불투명도 만 생성했기 때문에 눈에 띄기가 어려웠습니다. 감사!
— Jesus Rodriguez

0

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

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

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

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


0

내 경우에는 loadView ()
가이 코드를 중단 했습니다 : self.edgesForExtendedLayout = UIRectEdgeNone

하지만 loadView () 삭제 후 모든 것이 잘 작동했습니다.

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