[ios] iOS 7 : 상태 표시 줄 아래에 UITableView가 표시됨

내 응용 프로그램의 첫 번째 화면 UITableViewController에는 탐색 표시 줄 이 없습니다. 즉, 내용이 상태 표시 줄 아래로 흐르므로 많은 텍스트 충돌이 발생합니다. 두 속성을 모두 조정했습니다.Under top bars 하고 Adjust scroll view insets있는 사실에서 스크롤을 중지 않지만, 아래 테이블 뷰의 상단을 유지하는 비용. UITableView프레임을 20 픽셀 오프셋 으로 설정하려고 시도했지만 효과가없는 것 같습니다. 현재 iOS 6과 호환되는 앱이 필요하므로 자동 레이아웃을 사용하도록 iOS 7 스토리 보드로 이동할 수 없습니다 상단 높이 가이드. 누구든지 두 버전 모두에서 작동하는 솔루션을 찾았습니까?

내가 시도한 것 : 설정 edgesForExtendedLayout, 스토리 보드에서 설정 변경Under top bars 하고 Adjust scroll view, 새로운 영역으로 프레임을 강제.

그림은 천 단어의 가치가 있습니다.
상태 표시 줄 아래



답변

이 복제에 관심이있는 사람은 다음 단계를 따르십시오.

  1. 새로운 iOS 프로젝트 생성
  2. 메인 스토리 보드를 열고 기본 / 초기화를 삭제하십시오 UIViewController
  3. UITableViewController객체 라이브러리에서 새 항목 을 드래그
  4. 초기 뷰 컨트롤러로 설정
  5. 테스트 데이터를 테이블에 공급

위의 단계를 수행하면 앱을 실행할 때 Xcode의 확인란을 “{Top, Bottom, Opaque} Bar 아래의 가장자리 확장”으로 조정하여 첫 번째 행이 상태 표시 줄 아래에 나타나지 않게하는 등 아무것도 작동하지 않습니다. 프로그래밍 방식으로이 문제를 해결할 수도 없습니다.

예를 들어, 위 시나리오에서는 다음과 같은 효과 가 없습니다 .

// These do not work
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;

이 문제는 매우 실망 스러울 수 있으며 특히 Apple의 사전 배선 된 버그로 인해 Apple의 버그라고 생각합니다. UITableViewController 객체 라이브러리에서 입니다.

“매직 숫자 20″과 같은 “매직 숫자”형식을 사용하여이 문제를 해결하려는 모든 사람에게 동의하지 않습니다. 이런 종류의 밀접하게 결합 된 프로그래밍은 분명히 애플이 우리가 원하는 것이 아닙니다.

이 문제에 대한 두 가지 해결책을 발견했습니다.

  • 보존 UITableViewController의 장면을 :
    당신은 유지하려는 경우 UITableViewController수동으로 다른보기로 배치하지 않고, 스토리 보드에서, 당신은을 포함 할 수 있습니다 UITableViewControllerA의 UINavigationController인스펙터에서 (편집자> 삽입에서> 네비게이션 컨트롤러)의 선택을 취소 “쇼 탐색 막대” . 이를 통해 추가 조정이 필요없는 문제를 해결 UITableViewController하고 스토리 보드의 장면을 보존 할 수 있습니다 .

  • AutoLayout을 사용하고 UITableView다른보기에 포함 (Apple이 우리가 원하는 방식이라고 생각합니다) :
    빈을 UIViewController만들고 드래그하십시오 UITableView. 그런 다음 Ctrl 키를 누른 UITableView상태에서 상태 표시 줄을 향해 드래그하십시오 . 마우스가 상태 표시 줄의 맨 아래로 이동하면 “Top Layout Guide”라는 자동 레이아웃 풍선이 나타납니다. 마우스를 놓고 “수직 간격”을 선택하십시오. 레이아웃 시스템에 상태 표시 줄 바로 아래에 배치하도록 지시합니다.

빈 응용 프로그램에서 두 가지 방법을 테스트했으며 모두 작동합니다. 프로젝트에서 작동하도록 추가 조정을 수행해야 할 수도 있습니다.


답변

프로그래밍 방식으로 일을하고 최선의 방법 UITableViewController없이 사용하는 UINavigationController경우 다음을 수행하는 것입니다 viewDidLoad.

스위프트 3

self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

이전 스위프트

self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);

UITableViewController여전히 상태 표시 줄 뒤로 스크롤하지만 정상에 스크롤 할 때 아래되지 않습니다.


답변

참고 : 이것은 다음 구성에서 효과적이었습니다.

  • 화면 상단에 탐색 표시 줄이 없습니다 (테이블보기가 상태 표시 줄을 충족 함)
  • 테이블 뷰는 스크롤 할 수 없습니다

위의 두 가지 요구 사항이 충족되지 않으면 마일리지가 다를 수 있습니다.

원본 게시물

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

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


답변

최고 답변에 추가 :

두 번째 방법이 처음에는 효과가없는 것처럼 보였지만 추가 땜질을하고 해결책을 찾았습니다.

TLDR; 최상위 답변의 두 번째 솔루션은 거의 작동하지만 일부 버전의 xCode ctrl + dragging은 “Top Layout Guide”로 수직 간격을 선택해도 아무런 효과가 없습니다. 그러나 먼저 테이블 뷰의 크기를 조정 한 다음 “Top Space to Top Layout Guide”를 선택하면 작동합니다.


  1. 빈 ViewController를 스토리 보드로 드래그하십시오.
    뷰 컨트롤러

  2. UITableView 객체 를 View로 드래그하십시오 . (UITableViewController가 아님). 파란색 레이아웃 안내선을 사용하여 가장 중앙에 배치하십시오.

테이블 뷰
센터 이미지

  1. UITableViewCell을 TableView로 드래그하십시오. 이것은 프로토 타입 재사용 셀이므로 속성 탭에서 재사용 식별자를 설정해야합니다. 그렇지 않으면 충돌이 발생합니다.

테이블 뷰 셀 추가
재사용 식별자

  1. UIViewController의 사용자 정의 서브 클래스를 작성하고 <UITableViewDataSource, UITableViewDelegate>프로토콜을 추가하십시오 . Identity Inspector에서 스토리 보드의 ViewController를이 클래스로 설정하는 것을 잊지 마십시오.

  2. 구현 파일에서 TableView에 대한 콘센트를 작성하고 이름을 “tableView”로 지정하십시오.

콘센트 만들기
tableView

  1. TableView를 마우스 오른쪽 단추로 클릭하고 dataSource 및 대리자를 ViewController로 끕니다.

dataSource 델리게이트

이제 상태 표시 줄에 클리핑하지 않는 부분에 대해 설명합니다.

  1. 테이블 뷰의 상단 가장자리를 잡고 상단 근처의 파란색 파선 자동 레이아웃 안내선 중 하나로 이동하십시오.

크기 조정

  1. 이제 테이블 뷰에서 상단으로 드래그를 제어하고 상단 공간에서 상단 레이아웃 안내를 선택할 수 있습니다.

상단 공간에서 상단 레이아웃 안내

  1. 누락 된 제약 조건 추가와 완료로 TableView의 모호한 레이아웃에 대한 오류가 발생합니다.

누락 된 구속 조건 추가

이제 테이블보기를 평소와 같이 설정할 수 있으며 상태 표시 줄을 자르지 않습니다!


답변

- (void) viewDidLayoutSubviews {
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
        if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
            self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
        self.navigationController.navigationBar.translucent = NO;
    }
}

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1


답변

스토리 보드에서 UIViewController를 선택하고 상단 막대 아래 모서리 확장 옵션을 선택 취소하십시오. 나를 위해 일했다. 🙂


답변

이것은 “Swift”에 쓰는 방법입니다. @lipka의 답변에 대한 조정 :

tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)