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 조정

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

  • topLayoutGuide, bottomLayoutGuide

topLayoutGuidebottomLayoutGuide특성은 도면 컨트롤러의 뷰의 상부 또는 하부 에지 바의 위치를 나타낸다. 막대가 뷰의 상단 또는 하단과 겹치면 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]. 다음은 edgeForExtendedLayoutUIRectEdge 에 대한 클래스 참조에 대한 링크 입니다 .

[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.