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

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

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

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

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

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

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

최신 정보:

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

self.navigationController.navigationBar.translucent = NO;

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

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



답변

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같고 상단은
뷰의 하단과 같습니다. 두 속성 모두 요청시 느리게 생성됩니다.

애플 독을 참조하십시오


답변

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

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

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

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

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

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

[self setEdgesForExtendedLayout:UIRectEdgeNone];


답변

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

- (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 섹션).


답변

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

override func viewDidLoad() {
    super.viewDidLoad()

    edgesForExtendedLayout = []
}


답변

뷰에 반투명 탐색 막대가 표시되도록하려면 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);
}


답변

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


답변

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